【问题标题】:In ruby on rails, how can I validate multiple attributes for a range of values?在 ruby​​ on rails 中,如何验证一系列值的多个属性?
【发布时间】:2016-11-02 20:07:07
【问题描述】:

我在一个表中有大约 10 个以数字为值的属性,对于每个属性,我想验证是否将 1 - 100 之间的数字传递到输入中。有什么想法可以将下面的代码简化为一种方法验证吗?

目前,对于每个属性,我都在这样做;

validates_numericality_of :valueone, :less_than_or_equal_to => 100 validates_numericality_of :valuetwo, :less_than_or_equal_to => 100 validates_numericality_of :valuethree, :less_than_or_equal_to => 100

等等

非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    我认为你应该使用常量。它将产生更优雅的代码,如下所示:

    class Whatever
      MIN = 1
      MAX = 100
    
      validates :valueone, :valuetwo, :valuethree, :length => { :within => MIN..MAX }
    end
    

    您可以列出具有与上述相同验证的所有属性。

    应该这样做。 =)

    【讨论】:

    • 谢谢保罗。这也可以,但更有效的解决方法是 PinnyM 最初建议的。非常感谢您的帮助和回答!
    • 你能解释一下什么更有效吗?我没有看到有效的部分。两者都做同样的事情,唯一的区别是他们做的方式。
    • 高效是指从验证中删除属性并将它们放入数组中,如上面的示例所示。你的代码很好,但我选择了 PinnyM 的选项,因为我有很多属性需要验证,而 inline 选项会让它变得很麻烦。我希望这是有道理的。再次感谢。
    • 我得到了繁琐的部分。但就效率而言,它们完全相同。唯一的区别是,第一次迭代发生在验证之前,另一个在内部。但是我同意如果你有太多的属性要使用的话会很麻烦。为了使它更好,您可以使用常量来设置属性并对其进行迭代。将是一个更好的编码。 =)
    • 什么都没有。我很乐意提供帮助。 =)
    【解决方案2】:

    .each 会很好地工作:

    [:valueone, :valuetwo, :valuethree, ...].each do |n|
      validates n, :numericality => { :greater_than => 0, :less_than_or_equal_to => 100 }
    end
    

    【讨论】:

    • 酷。谢谢PinnyM!我会试一试。你反应很快:)
    • 完美高效的工作。我分配了一个变量来迭代属性集合,这样做我减少了每个属性的大量无关代码。再次感谢您的帮助 PinnyM!谢谢。
    【解决方案3】:

    通过添加以下代码进行验证:

    validates_numericality_of(
      :valueone,
      :valuetwo,
      :valuethree,
      less_than_or_equal_to: 100
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-29
      • 2013-02-03
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2018-06-24
      相关资源
      最近更新 更多