在Rails中调用自定义validation方法

我刚刚升级到2.3.4我的轨道,我注意到这与validation:让我说我有一个简单的模型公司有一个名字。 没有什么。 我想运行我自己的validation:

class Company < ActiveRecord::Base validate :something def something false end end 

在这种情况下保存模型实际工作。 同样的事情发生,如果我重写validate()并返回false。 我注意到这在一个更复杂的模型中,我的validation返回false,但对象仍然保存…我尝试了一个基本上是空的模型,并应用相同的东西。 我错过了一个新的练习吗? 这在我的一些旧的rails代码中似乎不是这种情况。

您使用validate方法时执行validate 。 不过,轨道不依赖于返回的值。

它依赖于是否有validation错误。 所以你应该添加错误,当你的模型不validation。

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

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

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

那么你的模型将不会被保存,因为有错误。

你在validation和callback之间感到困惑。

如果对象上有任何错误,validation应该失败,validation返回无关紧要。 callback失败,如果他们返回false,无论他们添加任何错误的对象。

Rails使用调用有效? 从保存调用不检查任何validation的结果。

编辑: Rails对待validate :method作为callback,但有效? 仍然不检查他们的结果,只是为了添加到对象的错误。

我不认为这种行为完全改变,但我可能是错的。 我不认为我曾经写过validation返回false。

只是FYI errors.add_to_base('error message')已被弃用在轨道3,被取代

 errors[:base] << "Error message" 

要么

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