[Ruby on Rails] 日付・時刻のバリデーションなら「ValidatesTimeliness」

Ruby on Rails で、日付・時刻のバリデーションをするなら ValidatesTimeliness という gem がおすすめです。

ActiveRecord だけでなく Mongoid でも使えるみたい。

adzap/validates_timeliness · GitHub はてなブックマーク - 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 はてなブックマーク - Plugin Parser · adzap/validates_timeliness Wiki

ValidatesTimeliness は、Date/time parser に timeliness を使ってるので、デフォルトのフォーマットは timeliness のページから確認できます。

timeliness/README.rdoc at master · adzap/timeliness · GitHub はてなブックマーク - timeliness/README.rdoc at master · adzap/timeliness · GitHub

ValidatesTimeliness 便利ですね。

日付や時刻のフォーマットって普遍だと思うので、Railsにデフォルトで搭載されていても良さそうなのに何でないんでしょうね?