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?

aarona
źródło

Odpowiedzi:

244

Od Rails 3 możesz:

validates :field, inclusion: { in: [ true, false ] }
Drew Dara-Abrams
źródło
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!

papużka falista
źródł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.

user708617
źródło
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
Flavio Wuensche
źródło
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] }
Cody Elhard
źródło
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