1

我在 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

奇怪的是,当我实例化一张照片时,验证已经发生了。

4

0 回答 0