【问题标题】:ActiveRecord validators chaining [duplicate]ActiveRecord 验证器链接 [重复]
【发布时间】:2014-02-08 12:55:25
【问题描述】:
class Task < ActiveRecord::Base
  validates :name, presence: true,
  validates :name, length: { minimum: 4, maximum: 255 }
end

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

谢谢!

【问题讨论】:

  • 是的,这应该可以解决问题,但我认为还有其他“正确”的方法可以做到这一点。谢谢!

标签: ruby-on-rails ruby validation activerecord


【解决方案1】:

你可能不想这样做,

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

当您说“如果我们有一些验证器在路上做一些广泛的工作怎么办”时,我明白您的意思,并且 afaik 没有优雅的内置方法可以做到这一点。

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

看看ActiveModel::Validations#run_validations! 是如何工作的(用pry 戳对象),你可能会在那里得到一些见解,这将使你能够为你的问题拼凑出一个更优雅的解决方案 - 你不是很优雅,使用被黑的方法可能很优雅,但实现本身可能会很老套。


说了这么多,这篇文章要注意的是:

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

【讨论】:

  • 上面的例子很简单,但并非总是如此。如果我们有一些验证器在路上做一些广泛的工作(如数据库查询、api 查询等)。遍历整个链条没有意义,因为我们已经失败了。
  • @Viorel,更新答案
  • 我并没有过早优化,我只是在学习活动记录:)。只是想知道我是否可以这样做。谢谢你的回答!
猜你喜欢
  • 2013-08-25
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2012-10-29
  • 2021-04-11
  • 2012-09-21
相关资源
最近更新 更多