Railsy: jak sprawdzić, czy coś jest wartością logiczną?


115

Czy szyny mają walidator, taki jak validates_numericality_ofdla wartości logicznych, czy też muszę użyć własnego?

Odpowiedzi:


244

Od Rails 3 możesz:

validates :field, inclusion: { in: [ true, false ] }

2
Tak więc weryfikacja jest poprawna, ale komunikat o błędzie nie jest pomocny dla użytkownika końcowego: „myfield nie ma na liście”
Peter Sankauskas

2
Słuszna uwaga. Możesz dostosować komunikat o błędzie: guide.rubyonrails.org/…
Drew Dara-Abrams

55
Krótsza formavalidates :field, inclusion: [true, false]
ledwie znana

8
Zauważ, że nie możesz mieć zwykłej weryfikacji obecności ( validates :field, presence: true) dla pola boolowskiego (pole nie będzie prawidłowe dla falsewartości). Ale w obu Railsach 3 i 4, gdybyś validates :field, inclusion: [true, false]przetestował włączenie do listy wartości, z efektem ubocznym, aby sprawdzić obecność pola (chyba że jedna z tych wartości jest niloczywiście).
Martin Carel

1
A dla tych, którzy tego potrzebują z komunikatem o błędzie:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
tagaizm

38

Uważam, że dla pola boolowskiego będziesz musiał zrobić coś takiego:

validates_inclusion_of :field_name, :in => [true, false]

Ze starszej wersji interfejsu API : „Wynika to ze sposobu, w jaki Object # blank? Obsługuje wartości logiczne. False.blank? # => True”

Nie jestem jednak pewien, czy to nadal będzie dobre dla Rails 3, mam nadzieję, że pomogło!


lol @ Rails 3. Mogę się założyć, że będzie to zastrzeżenie na nadchodzące miesiące. Ok, myślałem, że to było to i ty się zgadzasz. Dzięki!
aarona

To prawda dla Rails 4! Wow, false.blank? # => true wydaje się po prostu złą odpowiedzią, coś, czego nie oczekiwałbym od Railsów.
Dan Barron

1
To nie działa, ponieważ każdy napis, np. "Foo", zostanie przekonwertowany na true.
Ka Mok

10

Kiedy to stosuję, otrzymuję:

Ostrzeżenie przed dopasowanymi osobami:

Używasz validate_inclusion_ofdo stwierdzenia, że ​​kolumna logiczna dopuszcza wartości logiczne i nie zezwala na wartości inne niż boolowskie. Należy pamiętać, że nie jest możliwe pełne przetestowanie tego, ponieważ kolumny logiczne automatycznie przekonwertują wartości inne niż boolowskie na wartości logiczne. Dlatego powinieneś rozważyć usunięcie tego testu.


W przypadku pól, w których dozwolone jest null, czy nadal konwertuje nil na wartość logiczną?
mwfearnley

Po prostu usuń ten test, chyba że kolumna dopuszcza wartość null, powinieneś to zrobić: it {should allow_value (nil) .for (: field)} Odniesienie
Ardi Nusawan

4

Możesz użyć krótszej wersji:

validates :field, inclusion: [true, false]

Dodatkowa myśl. Kiedy mam do czynienia z wyliczeniami, lubię też używać stałej:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS

2

Odpowiedz zgodnie z dokumentami Rails 5.2.3

Ten pomocnik (obecność) sprawdza, czy określone atrybuty nie są puste. Wykorzystuje puste miejsce? metody, aby sprawdzić, czy wartość jest równa zero lub pusty ciąg, to znaczy ciąg, który jest pusty lub składa się z białych znaków.

Od false.blank? jest prawdą, jeśli chcesz zweryfikować obecność pola boolowskiego, powinieneś użyć jednej z następujących walidacji:

validates :boolean_field_name, inclusion: { in: [true, false] }

Ta sama odpowiedź, co poprzednia, z wyjątkiem zaktualizowanych dokumentów, które odzwierciedlają fakt, że rakiety haszujące nie są już potrzebne. +1.
aarona
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.