我在 lib/validators/past_validator.rb 中有一个自定义验证器,如下所示:
class PastValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
(record.errors[attribute] << "must be in the past") if value >= Date.today
end
end
我在 application.rb 中要求这样:
config.autoload_paths += %W(#{config_root}/lib/validators)
我想在两个模型用户和照片中使用这个验证器。用户有生日(日期),照片有日期属性“taken_on”,两者都必须是过去。
在 user.rb 我有以下行:
validates :birthday, allow_nil: true, past: true
生日的验证在这里就像魅力一样。
在 photo.rb 中:
def self.new_photo(params)
photo = new(taken_on: (Date.parse params[:taken_on]) )
photo
end
validates :taken_on, presence: true, past: true
如果我注释掉“过去:真”,这也有效,但如果没有,我会得到 NoMethodError。回溯向我显示,该值未在验证器中设置,因此解释器认为值必须是一种方法并给我一个 NoMethodError。但是为什么没有设置值?
我已经尝试在 photo.rb 中执行以下操作:
def self.new_photo(params)
date = Date.parse params[:taken_on]
p date # Gives me a correct instance of Date
photo = new(taken_on: date)
photo
end
validates :taken_on, presence: true, past: true, on: :create
奇怪的是,当我实例化一张照片时,验证已经发生了。