Rails:验证字符串的最小和最大长度,但将其留空


87

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

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

我该怎么写才能实现我的目标?

Answers:



130

您也可以使用以下格式:

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

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

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


11

甚至更简洁(使用新的哈希语法),来自validates文档

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

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


在不认为in将与字符串一起使用,似乎只是数字
生态学

1
应该可以,validates :foo, length: 2..5, allow_blank: true但是在OP的情况下可以使用`length:{is:5}`
PhilT '16

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

2
validates_length_of :reason, minimum: 3, maximum: 30

rspec同样是

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

2

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


-1

添加模型:

validates :color, length: { is: 7 }

颜色是一个字符串:

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

-4

在您的模型中

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.