Rails: ¿cómo valido que algo es un booleano?

115

¿Los rieles tienen un validador como validates_numericality_ofpara booleano o necesito rodar el mío?

aarona
fuente

Respuestas:

244

Desde Rails 3, puede hacer:

validates :field, inclusion: { in: [ true, false ] }
Dibujó Dara-Abrams
fuente
2
Entonces, esto hace que la validación sea correcta, pero el mensaje de error no es útil para el usuario final: "myfield no está incluido en la lista"
Peter Sankauskas
2
Buen punto. Puede personalizar el mensaje de error: guides.rubyonrails.org/…
Drew Dara-Abrams
55
Forma más cortavalidates :field, inclusion: [true, false]
apenas conocido
8
Tenga en cuenta que no puede tener la validación habitual para la presencia ( validates :field, presence: true) para un campo booleano (el campo no sería válido para un falsevalor). Pero tanto en los rieles 3 como en el 4, el tener validates :field, inclusion: [true, false]probaría la inclusión en una lista de valores, con el efecto secundario para probar la presencia del campo (a menos que uno de esos valores sea, nilpor supuesto).
Martin Carel
1
Y para aquellos que lo necesitan con un mensaje de error:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
tagaism
38

Creo que para un campo booleano necesitarás hacer algo como:

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

De una versión anterior de la API : "Esto se debe a la forma en que Object # blank? Maneja los valores booleanos. False.blank? # => True"

Sin embargo, no estoy seguro de si esto seguirá estando bien para Rails 3, ¡espero que haya ayudado!

Periquito
fuente
lol @ Rails 3. Puedo apostar que esta será la advertencia en los próximos meses. Ok, pensé que esto había sido todo y estás de acuerdo. ¡Gracias!
aarona
¡Es cierto para Rails 4! Vaya, ¿falso.en blanco? # => verdadero parece la respuesta incorrecta , algo que no esperaría de Rails.
Dan Barron
1
Esto no funciona, ya que cualquier cadena, por ejemplo, "foo" se convertirá en true.
Ka Mok
10

Cuando aplico esto, obtengo:

Advertencia de los shoulda-matchers:

Está utilizando validate_inclusion_ofpara afirmar que una columna booleana permite valores booleanos y no permite valores no booleanos. Tenga en cuenta que no es posible probar esto por completo, ya que las columnas booleanas convertirán automáticamente los valores no booleanos en valores booleanos. Por lo tanto, debería considerar eliminar esta prueba.

user708617
fuente
Para los campos donde se permite nulo, ¿todavía convierte nil en booleano?
mwfearnley
Simplemente elimine esa prueba, excepto si la columna es anulable, debe hacer esto: {should allow_value (nil) .for (: field)} Reference
Ardi Nusawan
4

Puede utilizar la versión más corta:

validates :field, inclusion: [true, false]

Pensamiento extra. Cuando trato con enumeraciones, también me gusta usar una constante:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS
Flavio Wuensche
fuente
2

Responda de acuerdo con Rails Docs 5.2.3

Este ayudante (presencia) valida que los atributos especificados no estén vacíos. ¿Utiliza el espacio en blanco? para comprobar si el valor es nulo o una cadena en blanco, es decir, una cadena que está vacía o consta de espacios en blanco.

¿Desde false.blank? es cierto, si desea validar la presencia de un campo booleano, debe usar una de las siguientes validaciones:

validates :boolean_field_name, inclusion: { in: [true, false] }
Cody Elhard
fuente
Esta es la misma respuesta que la anterior, excepto que los documentos actualizados reflejan el hecho de que los cohetes hash ya no son necesarios. +1.
aarona