2010-12-14 2 views
59

Ich habe ein Feld, das ich validieren möchte. Ich möchte, dass das Feld leer gelassen werden kann, aber wenn ein Benutzer Daten eingibt, möchte ich, dass sie in einem bestimmten Format sind. Derzeit bin ich mit den unten Validierungen im Modell, aber dies ist nicht der Benutzer es leer lassen:Validierung der Min- und Max-Länge einer Zeichenkette, aber zulassen, dass sie leer ist

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

Wie schreibe ich dies mein Ziel zu erreichen?

Antwort

-4

In Ihrem Modell z.B.

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

jeder validates_ * akzeptiert: if oder: es sei denn, Optionen

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

wo validate_foo_condition Methode ist die wahr oder falsch zurückgibt

Sie auch ein Proc-Objekt übergeben können:

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

Sie können auch dieses Format verwenden:

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

Oder seit Ihrem min und max gleich ist, wird die folgende auch arbeiten:

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

Oder noch prägnante (mit der neuen Hash-Syntax), aus den validates documentation:

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

Die obere Grenze sollte wahrscheinlich etwas aussagekräftiger sein als "in: 5..20", sondern nur die Frage auf den Buchstaben beantworten.

+0

In glaube nicht, 'in' wird Arbeit mit Strings, scheint nur Zahlen zu sein – ecoologic

+1

Dies sollte stattdessen funktionieren 'validates: foo, length: 2..5, allow_blank: true' aber' length: {is: 5} 'würde im OP-Fall tun – PhilT

+0

@PhilT Thank Sie, aktualisierte Antwort! –

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

rspec für die gleiche ist

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

Wie wäre das: validates_length_of :foo, is: 3, allow_blank: true

Verwandte Themen