如何一起使用默认和自定义验证器?如何定义他们的订单?

时间:2013-04-07 13:35:57

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

这是我的模特课:

class Availability < ActiveRecord::Base
  attr_accessible :beginning_date, :end_date
  validates :beginning_date, :end_date :presence => true

  # custom validators
  validate :dates_cant_be_in_the_past

  def dates_cant_be_in_the_past
    if Date.parse(beginning_date) < Date.today
      errors.add(:beginning_date, "cant be in the past")
    end

    if Date.parse(end_date) < Date.today
      errors.add(:end_date, "cant be in the past")
    end
  end
end

现在应该发生两件事:首先验证beginning_dateend_date属性的存在,然后运行我的dates_cant_be_in_the_past验证器。 可悲的是,这种方法不起作用。如果我将字段留空,Date.parse方法会抛出异常,因为参数显然是空的。

是否可以定义默认和自定义验证的顺序?或者我必须自己实现在线验证器,所以我会做类似的事情:

validate :dates_cant_be_blank, :dates_cant_be_in_the_past

guide至少说:

  

您可以为每个类方法传递多个符号,相应的验证将按照注册时的顺序运行。

提前感谢

2 个答案:

答案 0 :(得分:1)

如果为此创建验证器,则更简单:

class DateValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    if Date.parse(value) < Date.today
      record.errors.add(attribute, "cant be in the past")
    end
  end
end

在您的模型中,您可以像这样使用它:

class Availability < ActiveRecord::Base
  attr_accessible :beginning_date, :end_date
  validates :beginning_date, :end_date :presence => true
  validates :beginning_date, :end_date, :date => true, :allow_blank => true
end

:allow_blank如果值为空,则阻止验证运行。使用真实的验证器对象也会删除模型中的代码,使其更加简单,并删除您当前的复制品。

答案 1 :(得分:0)

你可以试试这样的事情

class Availability < ActiveRecord::Base
  attr_accessible :beginning_date, :end_date
  validates :beginning_date, :end_date : presence => true

  # custom validators
  validate :valid_dates


  def valid_dates
    if valid_string(beginning_date)
      errors.add(:beginning_date, "Can't be in the past") unless Date.parse(beginning_date) > Date.today
    end

    if valid_string(end_date)
      errors.add(:end_date, "Can't be in the past") unless Date.parse(end_date) > Date.today
    end

  end

  def valid_string(test_value)
    test.value.is_a? String
  end

end