这是我的模特课:
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_date
和end_date
属性的存在,然后运行我的dates_cant_be_in_the_past
验证器。
可悲的是,这种方法不起作用。如果我将字段留空,Date.parse
方法会抛出异常,因为参数显然是空的。
是否可以定义默认和自定义验证的顺序?或者我必须自己实现在线验证器,所以我会做类似的事情:
validate :dates_cant_be_blank, :dates_cant_be_in_the_past
guide至少说:
您可以为每个类方法传递多个符号,相应的验证将按照注册时的顺序运行。
提前感谢
答案 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