ActiveModel验证自定义setter

时间:2014-03-04 11:52:21

标签: ruby-on-rails ruby validation activemodel

假设我在activemodel模型DateRange上有自定义setter,以便在输入字符串时自动设置DateTime属性。看起来像这样

  def from=(value)
    @from = value.to_date
  end

现在,如果输入有效的日期字符串,这确实有效,但是如果输入的日期无效,则会停止我的应用程序。如何取消分配以便应用程序继续运行并且DateRange稍后在我的控制器中验证失败?

3 个答案:

答案 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