2014年12月10日水曜日

Railsでdatetimes型のvalidatetionをvalidates_timelinessを使ってする方法

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

# 18歳以上の確認
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 # Method symbol

# 今日以降の日付かの確認
# :todayは、config/initializers/validates_timeliness.rbで設定可能。
validates_date :booked_at, :on => :create, :on_or_after => :today 

# AM 9:00~PM5:00の間の確認
validates_time :booked_at, :between => ['9:00am', '5:00pm']
# 同じくAM 9:00~PM5:00の間の確認
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'

0 件のコメント:

コメントを投稿

statistics