1

这是我的模型课:

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_dateandend_date属性的存在,然后运行我的dates_cant_be_in_the_past验证器。可悲的是,这种方法不起作用。如果我将字段留空,则该Date.parse方法会引发异常,因为参数显然是空的。

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

validate :dates_cant_be_blank, :dates_cant_be_in_the_past

指南至少说:

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

预先感谢

4

2 回答 2

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值为空,则阻止验证运行。使用真正的验证器对象还会从您的模型中删除代码,使其更简单,并删除您当前拥有的重复项。

于 2013-04-07T13:54:23.327 回答
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
于 2013-04-07T13:56:55.623 回答