Rails: comment valider que quelque chose est un booléen?

115

Les rails ont-ils un validateur comme validates_numericality_ofpour booléen ou dois-je rouler le mien?

Aarona
la source

Réponses:

244

Depuis Rails 3, vous pouvez faire:

validates :field, inclusion: { in: [ true, false ] }
Drew Dara-Abrams
la source
2
Donc, cela obtient la bonne validation, mais le message d'erreur n'est pas utile pour l'utilisateur final: "myfield n'est pas inclus dans la liste"
Peter Sankauskas
2
Bon point. Vous pouvez personnaliser le message d'erreur: guides.rubyonrails.org
Drew Dara-Abrams
55
Shorter formvalidates :field, inclusion: [true, false]
peine connu
8
Notez que vous ne pouvez pas avoir la validation habituelle de la présence ( validates :field, presence: true) pour un champ booléen (le champ ne serait pas valide pour une falsevaleur). Mais dans les deux Rails 3 et 4, avoir validates :field, inclusion: [true, false]testerait l'inclusion dans une liste de valeurs, avec l'effet secondaire de tester la présence du champ (sauf si l'une de ces valeurs est nilbien sûr).
Martin Carel
1
Et pour ceux qui en ont besoin avec un message d'erreur:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
tagaism
38

Je crois que pour un champ booléen, vous devrez faire quelque chose comme:

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

À partir d'une ancienne version de l' API : "Cela est dû à la façon dont Object # blank? Gère les valeurs booléennes. False.blank? # => True"

Je ne sais pas si cela fonctionnera toujours pour Rails 3, j'espère que cela a aidé!

Perruche
la source
lol @ Rails 3. Je peux parier que ce sera la mise en garde pour les mois à venir. Ok, je pensais que ce migth avait été fait et vous êtes d'accord. Merci!
aarona
C'est vrai pour Rails 4! Wow, faux.blank? # => true semble juste être la mauvaise réponse, quelque chose que je n'attendrais pas de Rails.
Dan Barron
1
Cela ne fonctionne pas, car toute chaîne, par exemple, "foo" sera convertie en true.
Ka Mok
10

Lorsque j'applique ceci, j'obtiens:

Avertissement des shoulda-matchers:

Vous utilisez validate_inclusion_ofpour affirmer qu'une colonne booléenne autorise les valeurs booléennes et interdit les valeurs non booléennes. Sachez qu'il n'est pas possible de tester complètement cela, car les colonnes booléennes convertiront automatiquement les valeurs non booléennes en valeurs booléennes. Par conséquent, vous devriez envisager de supprimer ce test.

user708617
la source
Pour les champs où null est autorisé, convertit-il toujours nil en booléen?
mwfearnley
Supprimez simplement ce test, sauf si la colonne est nullable, vous devriez le faire: il {devrait permettre_valeur (nil) .for (: field)} Référence
Ardi Nusawan
4

Vous pouvez utiliser la version plus courte:

validates :field, inclusion: [true, false]

Pensée supplémentaire. Lorsque je traite des énumérations, j'aime aussi utiliser une constante:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS
Flavio Wuensche
la source
2

Réponse selon Rails Docs 5.2.3

Cet assistant (présence) valide que les attributs spécifiés ne sont pas vides. Il utilise le blanc? pour vérifier si la valeur est nulle ou une chaîne vide, c'est-à-dire une chaîne vide ou constituée d'espaces.

Depuis false.blank? est vrai, si vous souhaitez valider la présence d'un champ booléen, vous devez utiliser l'une des validations suivantes:

validates :boolean_field_name, inclusion: { in: [true, false] }
Cody Elhard
la source
C'est la même réponse que la précédente, sauf que les documents mis à jour reflètent le fait que les fusées de hachage ne sont plus nécessaires. +1.
aarona