2013-01-23 15 views
24

Jestem całkiem nowy w Railsach i znalazłem mały fragment, aby potwierdzić obecność i unikalność krok po kroku: najpierw sprawdź obecność, a następnie sprawdź wyjątkowość.Zrozumienie sprawdzania Railsów: co robi program allow_blank?

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

jestem trochę zdezorientowany o używaniu presence => true i allow_blank => true razem.

Bez stosowania allow_blank => true obie reguły będą sprawdzane w tym samym czasie, a nie krok po kroku.

Dlaczego ta magia jest wykonywana przez allow_blank => true?

+7

w oficjalnym poradniku, który mówi ": allow_blank jest ignorowane przez weryfikator obecności." Może to pomaga. –

+1

również rzucić okiem na [tę wspaniałą odpowiedź] (http://stackoverflow.com/a/1655001/1371131) – weltschmerz

Odpowiedz

20

Co masz jest odpowiednikiem tego (zawinięte dla czytelności):

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

To trochę głupie, choć ponieważ jeśli wymagające obecności, to będzie „unieważnić” THE: allow_blank klauzula do: wyjątkowość.

Ma to więcej sensu, kiedy przechodzisz do korzystania z innych walidatorów, na przykład ... format i unikalność, ale nie chcesz żadnych kontroli, jeśli są puste. W takim przypadku dodanie "zastosowanego globalnie": allow_blank ma więcej sensu, a DRY trochę podnosi kod.

To ...

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

można zapisać następująco:

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

Wielkie dzięki! Właśnie znalazłem ten fragment gdzieś na stackoverflow i zastanawiałem się, dlaczego ktoś powinien używać 'allow_blank' i' presence' together :) – Slevin

+0

możesz użyć ich razem, aby wyświetlić inny komunikat o błędzie dla nieprawidłowego formatu vs puste na przykład. Jeśli nie wprowadzisz ustawienia allow_blank, otrzymasz "nieprawidłowy format" dla pustej wartości – montrealmike

6

:allow_blank jest opcja, że ​​będzie "wyłączyć" kilku weryfikatorów, ale nie walidator obecność. Rezultatem użycia tych dwóch elementów jest to, że gdy pole pozostanie puste, otrzymasz komunikat o błędzie :blank (tzn. "Nie może być pusty"), ale nie pozostałe komunikaty o błędach.

31

Poniższy rozróżnienie może być przydatna wiedzieć:

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

Czy to jest rzeczywiście prawda? O ile rozumiem dokumenty, allow_blank pominie walidacje dla wszystkich pustych wartości. 'nil' jest pustą wartością. Szybki test na Railsach 5 mówi mi, że 'nil' nie zawiedzie mojej walidacji ... – NobodysNightmare

+2

Ta odpowiedź jest bardzo NIEPRAWIDŁOWA! Przynajmniej w Rails 5. – dferrazm

0

z Rails adnotacji

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

tak, to znaczy, że kiedy używamy allow_blank na e-mail, czy e-mail jest zerowa , tylko jeden błąd został dodany do obiektu errors, przeskocz weryfikatory wyjątkowości.