Ruby on Rails で、日付・時刻のバリデーションをするなら ValidatesTimeliness という gem がおすすめです。
ActiveRecord だけでなく Mongoid でも使えるみたい。
・adzap/validates_timeliness · GitHub
validates_timeliness gem をインストール後、日本語のエラーメッセージを最低限、設定します。
# config/locales/model.ja.yml
ja:
activerecord:
errors:
messages:
invalid_date: は正しい形式で入力してください。
invalid_time: は正しい形式で入力してください。
invalid_datetime: は正しい形式で入力してください。
基本的な設定はこれだけで、あとはモデルに validates_datetime とかでバリデーションを設定できます。
# app/models/article.rb
class Article < ActiveRecord::Base
validates_datetime :published_at
validates_date :published_date
validates_time :published_time
end
日付や時刻のバリデーションフォーマットがデフォルトのものだけでは、足りない場合は、独自定義したフォーマットを追加することもできます。
Plugin Parser を config.use_plugin_parser = true でONにして、config.parser.add_formats で追加するだけです。
# config/initializers/validates_timeliness.rb
ValidatesTimeliness.setup do |config|
config.use_plugin_parser = true
config.parser.add_formats(:time, "%H:%M")
end
上記は、Time に「01:23」みたいなフォーマットも許可する設定です。
もっと詳しい情報はWikiを見てください。
・Plugin Parser · adzap/validates_timeliness Wiki
ValidatesTimeliness は、Date/time parser に timeliness を使ってるので、デフォルトのフォーマットは timeliness のページから確認できます。
・timeliness/README.rdoc at master · adzap/timeliness · GitHub
ValidatesTimeliness 便利ですね。
日付や時刻のフォーマットって普遍だと思うので、Railsにデフォルトで搭載されていても良さそうなのに何でないんでしょうね?