重构模型中多个字段的自定义验证

时间:2012-08-17 20:04:01

标签: ruby-on-rails validation custom-validators

我有一个带有自定义验证功能的模型,用于验证日期不是过去的日期。目前,验证是硬编码的,用于检查模型中的单个字段selected_date。我如何重构验证,以便我可以将参数传递给自定义验证,以便我可以测试2个字段?

class Appointment < ActiveRecord::Base
  attr_accessible :selected_date, :alternate_date

  validates_presence_of :selected_date
  validate :validate_date

  def validate_date
    if selected_date < Date.today
      errors.add(:selected_date, 'Date has passed')
    end
  end
end

1 个答案:

答案 0 :(得分:1)

创建文件lib / future_validator.rb:

class FutureValidator < ActiveModel::EachValidator

  def validate_each(object, attribute, value)
    if value < Date.today
      object.errors[attribute] << "has passed"
    end
  end

end

在你的模特中:

validates :selected_date, presence: true, future: true
validates :other_date, presence: true, future: true

请参阅此RailsCast:Validations in Rails 3

注意:确保在config / application.rb中自动加载lib文件,并在添加该文件后重新启动服务器。