Railsでdates や times, datetimesのバリデーションをするメソッドが標準で用意されていないので、下記のGemを導入して対応しました。
その時の、手順メモです。
GitHub adzap/validates_timeliness
インストール
以下をGemfileに追記して、bundle install を実行する。
# Datetime型 validates
# https://github.com/adzap/validates_timeliness/
gem 'validates_timeliness', '~> 3.0'
gemのinstallが終わったら、下記を実行して設定ファイルを生成する。
rails generate validates_timeliness:install
上記を実行すると、下記のファイルが生成される。
create config/initializers/validates_timeliness.rb
create config/locales/validates_timeliness.en.yml
実装
validates_datetime :occurred_at
validates_date :date_of_birth, :before => lambda { 18.years.ago },
:before_message => "must be at least 18 years old"
validates_datetime :finish_time, :after => :start_time
validates_date :booked_at, :on => :create, :on_or_after => :today
validates_time :booked_at, :between => ['9:00am', '5:00pm']
validates_time :booked_at, :between => '9:00am'..'5:00pm'
validates_time :breakfast_time, :on_or_after => '6:00am',
:on_or_after_message => 'must be after opening time',
:before => :lunchtime,
:before_message => 'must be before lunch time'
config/initializers/validates_timeliness.rb
:nowや:today を使用する場合、下記のコメントアウトを外す。
config.restriction_shorthand_symbols.update(
:now => lambda { Time.current },
:today => lambda { Date.current }
)
config/locales/validates_timeliness.[en|ja].yml
バリデーションのメッセーを日本語に変更したい場合は、config/locales/validates_timeliness.ja.ymlファイルを作成して編集する。
ファイルのなかみのサンプル
ja:
errors:
messages:
invalid_date: "は、日付のフォーマットが間違っています"
invalid_time: "は、時間のフォーマットが間違っています"
invalid_datetime: "は、日時のフォーマットが間違っています"
is_at: "は、%{restriction} を指定してください"
before: "は、%{restriction} より小さい日時を指定してください"
on_or_before: "は、%{restriction} 以前の日時を指定してください"
after: "は、%{restriction} より大きい日時を指定してください"
on_or_after: "は、%{restriction} 以降の日時を指定してください"
validates_timeliness:
error_value_formats:
date: '%Y-%m-%d'
time: '%H:%M:%S'
datetime: '%Y-%m-%d %H:%M:%S'