【问题标题】:How to implement min/max validator in Rails 3?如何在 Rails 3 中实现最小/最大验证器?
【发布时间】:2010-12-11 10:27:08
【问题描述】:

在 Rails 3 中实现最小最大验证器的 rails 方式是什么?

我有一个模型,具有 min_age 和 max_age 属性。

年龄可以在 0..100 的范围内,但我也想验证交叉值,我的意思是 max 大于或等于 min

{:min_age => 0, :max_age => 0} => true
{:min_age => 0, :max_age => 1} => true
{:min_age => 1, :max_age => 0} => false # max < min
{:min_age => 1, :max_age => 101} => false # out of 0..100 range

【问题讨论】:

    标签: validation ruby-on-rails-3


    【解决方案1】:

    查看 ActiveModel::Validations::NumericalityValidator: RailsAPI NumericalityValidator

    规格:

    it {
      subject.max_age = 10
      subject.min_age = 20
      subject.should be_invalid
      subject.errors[:min_age].should include("must be less than or equal to #{subject.max_age}")
    }
    

    代码:

    validates :min_age, numericality: { greater_than: 0, less_than_or_equal_to: :max_age }
    
    validates :max_age, numericality: { less_than_or_equal_to: 100 }
    

    我不知道您是否要验证存在,但您只需将其作为另一个密钥添加到您的验证中,例如

    validates :max_age, numericality: { less_than_or_equal_to: 100 }, presence: true
    

    【讨论】:

    • 注意 - 这在“创建”上运行良好,但在“更新”上我得到一个“堆栈级别太深”错误 - 使用有效输入 - 这是一个很难找到的野兽。不知道这个验证器是什么原因,因为错误没有引用循环之前的代码行。
    【解决方案2】:

    你也可以使用inclusion...in,如:

    validates :height, inclusion: { in: 1..3000, message: 'The height must be between 1 and 3000' }
    

    【讨论】:

      【解决方案3】:
      validates_numericality_of :min_age, greater_than: 0
      validates_numericality_of :max_age, less_than_or_equal_to: 100
      validates_numericality_of :max_age, greater_than: :min_age
      

      你也可以使用年龄,像这样:

      validates_numericality_of :age, less_than_or_equal_to: 100, greater_than: 0
      

      【讨论】:

      • min_age 30,max_age 10,仍然会达到低谷,但它不应该 - 我在问题中的第三行代码。
      • 我建议您使用单一年龄输入,而不是最小和最大。一种解决方法是强制 max_age 大于 min_age。请参阅我的编辑。我没有测试代码。在任何情况下,您都需要一些代码来确保最小年龄不大于最大年龄。
      • 我不能使用单个属性,因为它不是年龄而是年龄范围。我知道我需要一些代码来确保值交叉,这是我的问题。
      • 您是否尝试过我在您最初发表评论后所做的编辑?看我的答案,第三行代码
      • 现在它与@rayban 发布的解决方案相同,但语法不同。不过还是谢谢。
      猜你喜欢
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 2014-12-26
      • 2022-07-06
      相关资源
      最近更新 更多