▽1
●
a-kuma3 ●100ポイント ベストアンサー |
Ruby on Rails の String#to_date の実装の実装がこんな感じです。
# File 'activesupport/lib/active_support/core_ext/string/conversions.rb', line 43 def to_date ::Date.parse(self, false) unless blank? endClass: String — Documentation for rails (4.0.0)
irb とかで試してみれば分かりますが、Date#parse は、自由度が かなり高いです。
さすがに 'a' とか渡すと例外が出ますが、'190' なんかでは、きちんと(?)parse してくれちゃいます ><
つまり、質問の二番目の実装では、例外が出ないので rescue に制御が渡らない...
試してませんけど、こんな感じでバリデータを実装してみたらどうでしょうか。
class DateValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) unless value.blank? and /\A\d{4}\-\d{2}\-\d{2}\Z/ =~ value record.errors[attribute] << (options[:message] || "2015-01-01の形式で入力してください") end end end