Rails: come convalido che qualcosa sia booleano?


115

Rails ha un validatore come validates_numericality_ofboolean o devo eseguire il rollio mio?

Risposte:


244

Da Rails 3, puoi fare:

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

2
Quindi, questo ottiene la convalida corretta, ma il messaggio di errore non è utile per l'utente finale: "myfield non è incluso nell'elenco"
Peter Sankauskas

2
Buon punto. Puoi personalizzare il messaggio di errore: guides.rubyonrails.org/…
Drew Dara-Abrams

55
Forma più brevevalidates :field, inclusion: [true, false]
appena sconosciuta il

8
Nota che non puoi avere la solita convalida per la presenza ( validates :field, presence: true) per un campo booleano (il campo non sarebbe valido per un falsevalore). Ma in entrambi i Rails 3 e 4, aver validates :field, inclusion: [true, false]testato l'inclusione in un elenco di valori, con l'effetto collaterale di testare la presenza del campo (a meno che uno di quei valori non sia nilovviamente).
Martin Carel

1
E per coloro che ne hanno bisogno con un messaggio di errore:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
tagaism

38

Credo che per un campo booleano dovrai fare qualcosa come:

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

Da una versione precedente dell'API : "Ciò è dovuto al modo in cui Object # blank? Gestisce i valori booleani. False.blank? # => True"

Non sono sicuro che questo andrà ancora bene per Rails 3, spero che abbia aiutato!


lol @ Rails 3. Posso scommettere che questo sarà l'avvertimento per i mesi a venire. Ok, pensavo che questo sia stato e tu sei d'accordo. Grazie!
aarona

È vero per Rails 4! Wow, false.blank? # => true sembra proprio la risposta sbagliata , qualcosa che non mi sarei aspettato da Rails.
Dan Barron

1
Questo non funziona, poiché qualsiasi stringa ad es. "Foo" verrà convertita in true.
Ka Mok

10

Quando lo applico, ottengo:

Avvertimento da parte di shoulda-matchers:

Stai utilizzando validate_inclusion_ofper affermare che una colonna booleana consente valori booleani e non consente quelli non booleani. Tieni presente che non è possibile testarlo completamente, poiché le colonne booleane convertiranno automaticamente i valori non booleani in valori booleani. Quindi, dovresti considerare di rimuovere questo test.


Per i campi in cui è consentito null, converte ancora nil in booleano?
mwfearnley

Basta rimuovere quel test, tranne se la colonna è nullable, dovresti farlo: {should allow_value (nil) .for (: field)} Riferimento
Ardi Nusawan

4

Puoi usare la versione più breve:

validates :field, inclusion: [true, false]

Pensiero extra. Quando si tratta di enumerazioni, mi piace usare anche una costante:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS

2

Risposta secondo Rails Docs 5.2.3

Questo helper (presenza) convalida che gli attributi specificati non sono vuoti. Usa lo spazio vuoto? per verificare se il valore è nullo o una stringa vuota, ovvero una stringa vuota o composta da spazi.

Dal momento che false.blank? è vero, se vuoi validare la presenza di un campo booleano dovresti usare una delle seguenti validazioni:

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

Questa è la stessa risposta della precedente tranne che i documenti aggiornati riflettono il fatto che i razzi hash non sono più necessari. +1.
aarona
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.