假设我在activemodel模型DateRange上有自定义setter,以便在输入字符串时自动设置DateTime属性。看起来像这样
def from=(value)
@from = value.to_date
end
现在,如果输入有效的日期字符串,这确实有效,但是如果输入的日期无效,则会停止我的应用程序。如何取消分配以便应用程序继续运行并且DateRange稍后在我的控制器中验证失败?
答案 0 :(得分:2)
def from=(value)
begin
@from = value.to_date
rescue ArgumentError, NoMethodError
errors.add(:from, "is not a valid date")
end
end
可能是更好的方法,但这应该有效
答案 1 :(得分:1)
您通常希望在您的设置器中解救/处理任何问题。
def from=(value)
@from = Date.parse(value)
rescue ArgumentError
nil
end
然后让你的正常日期验证稍后处理nil值。
我不会在setter中添加您的错误,因为它不需要知道您的验证,反之亦然。
答案 2 :(得分:0)
正如@jordelver所说,除了在验证期间添加验证错误没有任何意义。但是,您可以将错误保存在虚拟属性中,并在验证期间检查它。
validate :no_bad_dates
attr_accessor :bad_date_error
def from=(value)
@from = Date.parse(value)
rescue ArgumentError => ex
self.bad_date_error = ex
end
def no_bad_dates()
errors.add(:from, bad_date_error.message) if bad_date_error
end