2013-01-23 10 views
24

Sono abbastanza nuovo di Rails e ho trovato un piccolo frammento per convalidare la presenza e l'unicità passo dopo passo: prima controlla la presenza, poi controlla l'unicità.Informazioni sulla convalida di Rails: cosa fa allow_blank?

validates :email, :presence => true, :allow_blank => true, :uniqueness => { :case_sensitive => false } 

Sono un po 'confuso su come utilizzare presence => true e allow_blank => true insieme.

Senza utilizzare allow_blank => true entrambe le regole verranno controllate contemporaneamente e non in modo graduale.

Perché lo allow_blank => true fa questa magia?

+7

nella guida ufficiale dice ": allow_blank viene ignorato dal validatore di presenza." Forse questo aiuta. –

+1

anche dare un'occhiata a [questa grande risposta] (http://stackoverflow.com/a/1655001/1371131) – weltschmerz

risposta

20

Quello che hai è equivalente a questo (avvolto per chiarezza):

validates :email, :presence => true, 
      :uniqueness => { :allow_blank => true, :case_sensitive => false } 

Questo è un po 'sciocco però dato che se si sta richiedendo la presenza, allora che sta per "invalidare" il: allow_blank clausola a: unicità.

Ha più senso quando si passa all'utilizzo di altri validatori ... per esempio ... formato e univocità, ma non si desidera alcun controllo se è vuoto. In questo caso, aggiungendo un "applicato globalmente": allow_blank ha più senso e DRY risale un po 'il codice.

Questa ...

validates :email, :format => {:allow_blank => true, ...}, 
        :uniqueness => {:allow_blank => true, ...} 

si può scrivere come:

validates :email, :allow_blank => true, :format => {...}, :uniqueness => {...} 
+0

Grazie mille! Ho appena trovato questo frammento da qualche parte su StackOverflow e sono diventato curioso di sapere perché qualcuno dovrebbe usare 'allow_blank' e' presence' insieme :) – Slevin

+0

si potrebbe desiderare di usarli insieme per visualizzare un messaggio di errore diverso per formato non valido o vuoto, ad esempio. Se non si inserisce allow_blank, si otterrebbe un "formato non valido" per un valore vuoto – montrealmike

6

:allow_blank è un'opzione che si "disabilita" molti dei validatori, ma non il validatore presenza. Il risultato dell'utilizzo di questi due insieme è che quando il campo viene lasciato vuoto, verrà visualizzato il messaggio di errore :blank (ad esempio "non può essere vuoto"), ma non gli altri messaggi di errore.

31

la seguente distinzione può essere utile conoscere:

presence: true     # nil and empty string fail validation 
presence: true, allow_blank: true # nil fails validation, empty string passes 
+3

E 'vero che vero? Per quanto comprendo i documenti, allow_blank salterà le convalide su tutti i valori vuoti. 'nil' è un valore vuoto. Un rapido test su Rails 5 mi dice che 'nil' non fallisce la mia convalida ... – NobodysNightmare

+2

Questa risposta è super SBAGLIATA! Almeno in Rails 5. – dferrazm

0

da Rails annotazione

# * <tt>:allow_nil</tt> - Skip validation if the attribute is +nil+. 
# * <tt>:allow_blank</tt> - Skip validation if the attribute is blank. 

così, vuol dire quando usiamo allow_blank su e-mail, se l'email è pari a zero , un solo errore aggiunto all'oggetto errors, salta l'unicità valida.