Rails: Wie überprüfe ich, ob etwas ein Boolescher Wert ist?

115

Hat Rails einen Validator wie validates_numericality_offür Boolean oder muss ich meinen eigenen rollen?

aarona
quelle

Antworten:

244

Seit Rails 3 können Sie Folgendes tun:

validates :field, inclusion: { in: [ true, false ] }
Drew Dara-Abrams
quelle
2
Damit ist die Validierung richtig, aber die Fehlermeldung ist für den Endbenutzer nicht hilfreich: "myfield ist nicht in der Liste enthalten"
Peter Sankauskas
2
Guter Punkt. Sie können die Fehlermeldung anpassen : guides.rubyonrails.org/…
Drew Dara-Abrams
55
Kürzere Formvalidates :field, inclusion: [true, false]
kaum bekannt
8
Beachten Sie, dass Sie validates :field, presence: truefür ein boolesches Feld nicht die übliche Validierung für das Vorhandensein ( ) haben können (das Feld wäre für einen falseWert nicht gültig ). In beiden Schienen 3 und 4 validates :field, inclusion: [true, false]würde jedoch geprüft, ob sie in eine Werteliste aufgenommen wurden, mit dem Nebeneffekt, dass das Feld vorhanden ist (es sei denn, einer dieser Werte ist nilnatürlich).
Martin Carel
1
Und für diejenigen, die es mit einer Fehlermeldung brauchen:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
Tagaismus
38

Ich glaube, für ein boolesches Feld müssen Sie etwas tun wie:

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

Aus einer älteren Version der API : "Dies liegt an der Art und Weise, wie Object # blank? Mit booleschen Werten umgeht. False.blank? # => True"

Ich bin mir nicht sicher, ob dies für Rails 3 noch in Ordnung ist, hoffe, das hat geholfen!

Wellensittich
quelle
lol @ Rails 3. Ich kann wetten, dass dies die Einschränkung für die kommenden Monate sein wird. Ok, ich dachte, das wäre es und du stimmst zu. Vielen Dank!
Aarona
Es ist wahr für Rails 4! Wow, false.blank? # => true scheint einfach die falsche Antwort zu sein, etwas, das ich von Rails nicht erwarten würde.
Dan Barron
1
Dies funktioniert nicht, da jede Zeichenfolge, z. B. "foo", in konvertiert wird true.
Ka Mok
10

Wenn ich das anwende, bekomme ich:

Warnung von sollte-Matchern:

Sie verwenden validate_inclusion_of, um zu behaupten, dass eine boolesche Spalte boolesche Werte zulässt und nicht boolesche Werte nicht zulässt. Beachten Sie, dass dies nicht vollständig getestet werden kann, da boolesche Spalten nicht-boolesche Werte automatisch in boolesche Werte konvertieren. Daher sollten Sie diesen Test entfernen.

user708617
quelle
Konvertiert es für Felder, in denen null zulässig ist, immer noch nil in boolean?
mwfearnley
Entfernen Sie einfach diesen Test, außer wenn die Spalte nullwertfähig ist, sollten Sie dies tun: it {sollte allow_value (nil) .for (: field)} Referenz
Ardi Nusawan
4

Sie können die kürzere Version verwenden:

validates :field, inclusion: [true, false]

Zusätzlicher Gedanke. Beim Umgang mit Aufzählungen verwende ich auch gerne eine Konstante:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS
Flavio Wuensche
quelle
2

Antwort gemäß Rails Docs 5.2.3

Dieser Helfer (Anwesenheit) überprüft, ob die angegebenen Attribute nicht leer sind. Es benutzt das Leerzeichen? Methode zum Überprüfen, ob der Wert entweder null oder eine leere Zeichenfolge ist, dh eine Zeichenfolge, die entweder leer ist oder aus Leerzeichen besteht.

Da false.blank? Wenn Sie das Vorhandensein eines booleschen Felds überprüfen möchten, sollten Sie eine der folgenden Überprüfungen verwenden:

validates :boolean_field_name, inclusion: { in: [true, false] }
Cody Elhard
quelle
Dies ist die gleiche Antwort wie in der vorherigen, mit Ausnahme der aktualisierten Dokumente, die die Tatsache widerspiegeln, dass Hash-Raketen nicht mehr erforderlich sind. +1.
Aarona