2010-12-14 12 views
59

Ho un campo che desidero convalidare. Voglio che il campo possa essere lasciato vuoto, ma se un utente sta inserendo dati, voglio che sia in un determinato formato. Attualmente sto usando le convalide di sotto del modello, ma questo non consente all'utente di lasciare vuoto:Convalida la lunghezza minima e massima di una stringa ma che consente di essere vuota

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

Come faccio a scrivere questo per realizzare il mio obiettivo?

risposta

98

Penso che potrebbe avere bisogno di qualcosa come:

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

Altri esempi: ActiveRecord::Validations::ClassMethods

+3

per una dimensione specifica è possibile utilizzare il vincolo lunghezza: è – GuiGreg

-4

nel modello ad esempio

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

ogni validates_ * accetta: se o: a meno che le opzioni

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

dove validate_foo_condition è metodo che restituisce vero o falso

si può anche passare un oggetto Proc:

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

È inoltre possibile utilizzare questo formato:

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

O dal tuo min e max sono gli stessi, il seguente funziona anche:

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

O ancora più conciso (con la nuova sintassi hash), dal validates documentation:

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

Il limite superiore dovrebbe probabilmente rappresentare qualcosa di più significativo come "in: 5..20", ma semplicemente rispondere alla domanda alla lettera.

+0

In non credo 'tale dicitura sarà funziona con le stringhe, sembra essere solo il numero – ecoologic

+1

Questo dovrebbe funzionare invece 'validates: foo, length: 2..5, allow_blank: true' ma' length: {is: 5} 'farebbe nel caso dell'OP – PhilT

+0

@PhilT Grazie tu, risposta aggiornata! –

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

rspec per lo stesso è

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

Che ne dici: validates_length_of :foo, is: 3, allow_blank: true

Problemi correlati