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を定義することで、以下のような呼び出しが可能となります。

使い過ぎると可読性が下がりそうで不安な面もございますが、日付関連のバリデーションが大量に発生するようなアプリケーション(予約システムなど)を開発する際には、便利な機能ではないかと思います。

Rails

Posted by poison