【问题标题】:Rails: Validating min and max length of a string but allowing it to be blankRails:验证字符串的最小和最大长度,但允许它为空
【发布时间】:2011-05-25 10:06:46
【问题描述】:

我有一个要验证的字段。我希望该字段能够留空,但如果用户正在输入数据,我希望它采用某种格式。目前我在模型中使用以下验证,但这不允许用户将其留空:

validates_length_of :foo, :maximum => 5
validates_length_of :foo, :minimum => 5

我如何写这个来实现我的目标?

【问题讨论】:

    标签: ruby-on-rails ruby validation model


    【解决方案1】:

    您也可以使用这种格式:

    validates :foo, length: {minimum: 5, maximum: 5}, allow_blank: true
    

    或者由于您的最小值和最大值相同,因此以下内容也可以使用:

    validates :foo, length: {is: 5}, allow_blank: true
    

    【讨论】:

      【解决方案2】:

      我认为它可能需要类似:

      validates_length_of :foo, minimum: 5, maximum: 5, allow_blank: true
      

      更多例子:ActiveRecord::Validations::ClassMethods

      【讨论】:

      • 对于特定尺寸,您可以使用长度约束:is
      【解决方案3】:

      或者更简洁(使用新的哈希语法),来自validates documentation

      validates :foo, length: 5..5, allow_blank: true
      

      上限可能应该代表更有意义的东西,例如“in: 5..20”,但只是回答问题。

      【讨论】:

      • 在不认为in 将与字符串一起使用,似乎只是数字
      • 这应该可以代替 validates :foo, length: 2..5, allow_blank: true 但在 OP 的情况下 `length: { is: 5}`
      【解决方案4】:

      来自validates_length_of documentation

      validates_length_of :phone, :in => 7..32, :allow_blank => true
      

      :allow_blank - 属性可能为空;跳过验证。

      【讨论】:

        【解决方案5】:

        每个 validates_* 都接受 :if 或 :unless 选项

        validates_length_of :foo, :maximum => 5, :if => :validate_foo_condition
        

        其中 validate_foo_condition 是返回 true 或 false 的方法

        你也可以传递一个 Proc 对象:

        validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}
        

        【讨论】:

          【解决方案6】:
          validates_length_of :reason, minimum: 3, maximum: 30
          

          rspec 同样是

          it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }
          

          【讨论】:

            【解决方案7】:

            怎么样: validates_length_of :foo, is: 3, allow_blank: true

            【讨论】:

              【解决方案8】:

              添加你的模型:

              validates :color, length: { is: 7 }
              

              颜色是一个字符串:

              t.string :color, null: false, default: '#0093FF', limit: 7
              

              【讨论】:

                【解决方案9】:

                在您的模型中,例如

                def validate
                  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
                end
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-06-14
                  • 2017-11-15
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多