2014-02-08 75 views
2
class Task < ActiveRecord::Base 
    validates :name, presence: true, 
    validates :name, length: { minimum: 4, maximum: 255 } 
end 

如果“名称”值丢失的所有验证程序将运行,并且我将获得2个错误:一是从存在验证器和一个从长度验证,“名”太短。我如何链接这两个因此第一次失败停止验证队列。ActiveRecord的验证器链接

谢谢!

+0

是的,应该这样做,但我认为是其他“正确”的方法来做到这一点。谢谢! – Viorel

回答

1

你可能不希望这样做,

你可能想要做的是编辑的渲染错误的视图助手只能说明你在每一个属性链中的第一个错误,然后你可能会想要切换长度和存在验证者的地方:)

当你说“如果我们有一些验证器在做一些广泛的工作”,并且afaik没有优雅的话,我会得到你的意思建立这种方式。

在自定义验证器的形式中返回false会暂停回调链,并使用另一个问题中所述的:if:unless体操。

看看ActiveModel::Validations#run_validations!是如何工作的(用pry戳对象),你可能会在那里得到一些见解,使你能够将更优雅的解决方案解决到你的问题 - 不是很优雅的想法,使用黑客入侵的方法可能会很优雅,但实现本身可能会非常黑客。


说了这么多,从这个帖子保留的是:

你可能在这点上过早的优化和重验证,你可能做在某些时候可能会是使用不同的更分层的架构(使用自定义的验证器集合来创建表单类,例如参见7 Patterns to Refactor Fat ActiveRecord Models中的Form类)

+1

上面的例子很简单,但情况并非总是如此。如果我们有一些验证器做了一些广泛的工作(如db查询,api查询等),该怎么办?因为我们已经失败了,所以通过整个链条是没有意义的。 – Viorel

+0

@Viorel,更新回答 – bbozo

+0

我不是过早地优化,我只是学习活跃的记录:)。只是想知道我能否做到这一点。谢谢您的回答! – Viorel