validates_timelinessでdatetimeのバリデーションを行う
はじめに
Railsでアプリを作る際にdatetime型を使わないことはないと思います。その割にActiveRecordのvalidationにはdatetimeに対するサポートがちょっと少ない気がします。これを補うべく開発されたのがvalidates_timelinessでございます。
実装
何はともあれgemをインストールします。
gem install validates_timeliness
併せてインストーラーを実行します。
$ rails generate validates_timeliness:install
validatesにおける記述は、:timelinessによって行います。
validate_date/validate_time/validate_datetimeといった、型ごとのメソッドも存在しているようですが、個人的にはvalidatesでattributeごとに記述したい派でございます。
validates :expires_at, timeliness: { on_or_after: -> { Date.current }, type: :date }
オプションのtypeには、以下のいずれかを指定します。指定したtypeにより、対応するActiveModel::Typeの型にキャストされて、バリデーションが行われます。
- :data
- :time
- :datetime
また、バリデーションのrangeのヘルパーには、以下のオプションを指定することが可能です。
- :is_at
- :before
- :on_or_before
- :after
- :on_or_after
- :between
個人的に便利だと感じているのは、Restriction Shorthand機能です。lambdaの中でDate.currentなどとしていた箇所について、aliasを定義することで、以下のような呼び出しが可能となります。
使い過ぎると可読性が下がりそうで不安な面もございますが、日付関連のバリデーションが大量に発生するようなアプリケーション(予約システムなど)を開発する際には、便利な機能ではないかと思います。