2010-12-14 92 views
59

我有一个字段,我想验证。我希望该字段能够留空,但如果用户输入数据,我希望它以某种格式。目前我使用的模型下面的验证,但这并不让用户留空:验证字符串的最小和最大长度,但允许它为空

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

我怎样写这个实现我的目标?

回答

-4

在你的模型如

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

每validates_ *接受:如果还是:除非选择

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

您也可以使用这种格式:

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

或者因为你的最小值和最大值是相同的,下面也将工作:

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

甚至更​​简洁(与新的哈希语法),从validates documentation

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

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

+0

在不认为'in'会工作与字符串,似乎只是数字 – ecoologic 2015-06-09 02:42:19

+1

这应该工作,而不是'验证:富,长度:2..5,allow_blank:true',但长度:{是:5}'会在OP的情况下做 – PhilT 2016-04-05 15:07:15

+0

@PhilT谢谢你,更新了答案! – 2017-05-05 18:29:26

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

RSpec的为同是

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

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