在Rails中调用自定义验证方法

时间:2009-10-23 07:36:06

标签: ruby-on-rails validation

我刚刚将我的rails升级到2.3.4并且我注意到了这一点并进行了验证: 假设我有一个简单的模型公司,它有一个名字。什么都没有。 我想运行自己的验证:

class Company < ActiveRecord::Base

  validate :something


  def something
    false
  end

end

保存模型实际上适用于这种情况。 如果我覆盖validate()并返回false,则会发生同样的事情。 我在一个更复杂的模型中注意到这一点,我的验证返回false,但是对象仍在保存...我在一个基本上空的模型中尝试了它并应用了相同的东西。我缺少一种新的做法吗?在我的一些较旧的rails代码中似乎并非如此。

3 个答案:

答案 0 :(得分:109)

使用validate方法时会执行验证。但是rails不依赖于返回的值。

它依赖于是否存在验证错误。因此,您应该在模型未验证时添加错误。

def something
    errors.add(:field, 'error message')
end

或者,如果错误与字段无关:

def something
    errors.add(:base, 'error message')
end

然后您的模型将无法保存,因为存在错误。

答案 1 :(得分:15)

您在验证和回调之间感到困惑。

如果对象上有任何错误,验证应该失败,无论验证返回什么都无关紧要。如果返回false,则回调失败,无论它们是否向对象添加任何错误。

Rails使用有效的呼叫?来自保存调用,不会检查任何验证的结果。

编辑:Rails将validate :method视为回调,但有效吗?仍然不检查他们的结果,只检查他们添加到对象的错误。

我认为这种行为完全没有改变,但我可能错了。我认为我之前没有写过验证来返回false。

答案 2 :(得分:8)

仅限FYI errors.add_to_base('error message')已在rails 3中弃用,并被

取代
errors[:base] << "Error message" 

或者

errors.add(:base, "Error message")