我正在为我们的一个模型构建自定义验证,以验证日期的格式。所以日期应该是dd/mm/yyyy
目前它适用于dd / mm / yyyy和dd-mm-yyyy。但是我们发现有些人正在进入ddmmyyyy然后铁路吃了那个并吐出了其他东西。
所以我做了一个自定义验证
class DateFormatValidator < ActiveModel::Validator
def validate(record)
record.errors[:transaction_date] << "Date must be in the following format: mm/dd/yyyy" unless /\d{2}\/\d{2}\/\d{4}/.match(record.transaction_date)
end
end
然后在我要验证transaction_date
的模型中,我创建一个像这样的私有模型
def date_is_correct_format
validates_with DateFormatValidator
end
然后拨打validate :date_is_correct_format
我以前做过这个,但是这次似乎没有用,并且根本没有提出异常。我甚至可以在私有方法中做到这一点。
def date_is_correct_format
this_is_a_fake_method_that_should_blow_up
validates_with DateFormatValidator
end
并运行验证并将所有内容传递完毕。我不知道我错过了什么?我已经阅读了Ruby on Rails API,但我什么都看不到?
答案 0 :(得分:1)
我已尝试过您在上面发布的代码,但效果很好。
class User < ActiveRecord::Base
validate :date_is_correct_format
def date_is_correct_format
validates_with DateFormatValidator
end
end
class DateFormatValidator < ActiveModel::Validator
def validate(record)
record.errors[:transaction_date] << "Date must be in the following format: mm/dd/yyyy" unless /\d{2}\/\d{2}\/\d{4}/.match(record.transaction_date)
end
end
然后我在控制台中尝试,输出是:
[1] pry(main)> User.create!(:transaction_date=>'fdsf')
(0.1ms) begin transaction
(0.1ms) rollback transaction
ActiveRecord::RecordInvalid: Validation failed: Transaction date Date must be in the following format: mm/dd/yyyy
from /Users/zuozuo/.rvm/gems/ruby-2.0.0-p247@rails4/gems/activerecord- 4.0.0/lib/active_record/validations.rb:57:in `save!'
那你使用什么版本的Rails?
或者您可以尝试:
class User < ActiveRecord::Base
validates_with ::DateFormatValidator
end
这个工具也有效。