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

cgr*_*cgr 60 validation ruby-on-rails

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

class Company < ActiveRecord::Base

  validate :something


  def something
    false
  end

end
Run Code Online (Sandbox Code Playgroud)

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

Dam*_*IEU 110

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

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

def something
    errors.add(:field, 'error message')
end
Run Code Online (Sandbox Code Playgroud)

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

def something
    errors.add(:base, 'error message')
end
Run Code Online (Sandbox Code Playgroud)

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


EmF*_*mFi 15

你在验证和回调之间感到困惑.

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

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

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

我认为这种行为根本没有改变,但我可能是错的.我认为我之前没有写过验证来返回false.


Mag*_*led 8

仅仅是FYI errors.add_to_base('error message')在rails 3中被弃用并被替换为

errors[:base] << "Error message" 
Run Code Online (Sandbox Code Playgroud)

要么

errors.add(:base, "Error message")
Run Code Online (Sandbox Code Playgroud)