验证字符串的最小和最大长度,但允许它为空

时间:2010-12-14 17:01:14

标签: ruby-on-rails ruby validation model

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

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

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

9 个答案:

答案 0 :(得分:120)

我认为它可能需要类似的东西:

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

更多示例:ActiveRecord::Validations::ClassMethods

答案 1 :(得分:111)

您也可以使用以下格式:

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

或者由于你的最小值和最大值相同,以下内容也适用:

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

答案 2 :(得分:10)

来自validates_length_of documentation

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

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

答案 3 :(得分:8)

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

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

上限应该代表一些更有意义的内容,例如“in:5..20”,但只是回答问题。

答案 4 :(得分:3)

每个validates_ *接受:if或:除非选项

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?}

答案 5 :(得分:2)

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

答案 6 :(得分:1)

validates_length_of :reason, minimum: 3, maximum: 30

rspec同样是

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

答案 7 :(得分:0)

添加模型:

validates :color, length: { is: 7 }

颜色是一个字符串:

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

答案 8 :(得分:-4)

在您的模型中,例如

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