2010-12-14 88 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