ActiveRecord验证器链接

时间:2014-02-08 12:55:26

标签: ruby-on-rails ruby validation activerecord

class Task < ActiveRecord::Base
  validates :name, presence: true,
  validates :name, length: { minimum: 4, maximum: 255 }
end

如果缺少“name”值,则所有验证器都将运行,我将收到2个错误:一个来自在线验证器,另一个来自长度验证器,“name”太短。如何将这两个链接起来,以便第一次失败停止验证队列。

谢谢!

1 个答案:

答案 0 :(得分:1)

你可能不想这样做,

您可能想要做的是编辑呈现错误的视图助手,只显示每个属性链中的第一个错误,然后您可能想要切换长度和存在验证器的位置:)

当你说“如果我们有一些验证员可以做一些大量的工作时,我会明白你的意思”,并且afaik没有优雅的内置方式来做到这一点。

自定义验证器形式的解决方法是返回false,从而停止回调链并使用:if:unless体操,如另一个问题所述。

查看ActiveModel::Validations#run_validations!如何运作(用pry戳对象),你可能会在那里得到一些见解,这将使你能够将一个更优雅的解决方案整合到你的问题中 - 不是很优雅的头脑你,使用被黑客攻击的方法可能很优雅,但实现本身可能会非常hackish。


说完这一切之后,要保留这篇文章的内容是:

此时你可能过早地进行了优化,并且你可能在某些时候做的重度验证可能会使用一个不同的,更加分层的架构(带有自定义集的表单类)例如,验证器,请参阅7 Patterns to Refactor Fat ActiveRecord Models)中的Form类