【问题标题】:Is it possible to group validation?是否可以分组验证?
【发布时间】:2010-06-10 21:10:21
【问题描述】:

我使用了很多自己的验证方法来比较一个关联与另一个关联的数据。我注意到,在尝试调用它们之前,我一直在检查我的关联是否为 nil,但我也在验证它们的存在,所以我觉得我的 nil 检查是多余的。这是一个例子:

class House < ActiveRecord::Base
  has_one :enterance, :class => Door
  has_one :exit, :class => Door

  validates_presence_of :enterance, :exit

  validate :not_a_fire_hazard
  def not_a_fire_hazard
    if enterance && exit && enterance.location != exit.location
      errors.add_to_base('If there is a fire you will most likely die')
      return false
    end
  end
end

我觉得我在重复自己,在我自己的验证中检查是否存在进入和退出。

有没有更多的“Rails 方式”来做到这一点?

【问题讨论】:

    标签: ruby-on-rails validation activerecord


    【解决方案1】:

    您可能还想考虑使用validates_associated 节来验证关联对象本身是否有效。此外,另一种更简洁的方法可以确保入口和出口都存在(不是零),如下所示:

    validates_presence_of :entrance_or_foo
    
    def entrance_or_foo
        entrance and foo
    end
    

    然后你可以清理你的火灾隐患方法如下所示:

     def not_a_fire_hazard
        if enterance.location != foo.location
          errors.add_to_base('If there is a fire you will most likely die')
        end
     end
    

    你不需要上面定义中的 return false。

    正如 Francois 在 cmets 中所指出的,exit 是在 Kernel 模块中定义的方法。您应该重命名您的类,以免与 Ruby 定义的退出方法混淆。在上面的示例代码中,我已将 exit 实例重命名为 foo。

    【讨论】:

    • 进入和退出将退出服务器进程。 exit 是内核上的一种方法,用于停止 VM。哎呀
    • +1 弗朗索瓦,我没有在我的帖子中提到这一点。不过,我认为这个想法仍然存在。
    • 在出口上哎呀,这只是我编造的一个例子。我不确定这将如何解决我的问题,好像 not_a_fire_hazard 在验证链中,并且 entry 或 foo 为 nil,我仍将执行 nil.location。由于验证是同时进行的(也许在这种情况下不会?),即使 entry_or_foo 没有通过,not_a_fire_hazard 不会仍然被调用吗?
    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 2014-10-03
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多