我刚刚将我的rails升级到2.3.4并且我注意到了这一点并进行了验证: 假设我有一个简单的模型公司,它有一个名字。什么都没有。 我想运行自己的验证:
class Company < ActiveRecord::Base
validate :something
def something
false
end
end
保存模型实际上适用于这种情况。 如果我覆盖validate()并返回false,则会发生同样的事情。 我在一个更复杂的模型中注意到这一点,我的验证返回false,但是对象仍在保存...我在一个基本上空的模型中尝试了它并应用了相同的东西。我缺少一种新的做法吗?在我的一些较旧的rails代码中似乎并非如此。
答案 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")