我在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
奇怪的是,当我拍摄照片时,验证已经发生了。