Estoy tratando de asegurar que un campo de mi modelo sea booleano, pero mis pruebas siguen fallando.Rieles: la validación de la inclusión de un booleano falla las pruebas
Después de leer esto: Validating boolean value in Rspec and Rails y esto Rails: how do I validate that something is a boolean? terminé haciéndolo de este modo:
class Model < ActiveRecord::Base
validates :my_field, :inclusion => { :in => [true, false] }
end
he intentado probar esto unas cuantas maneras diferentes (usando rspec y shoulda comparadores) y desde mis pruebas en mantener fracasando, estoy ahora mismo al modo más tonto posible (?). Aún así, las pruebas no pasan y supongo que hay algún mecanismo que convierte el valor en alguna parte.
Aquí es lo que estoy usando para averiguar lo que está pasando:
# create instance without setting value ...
# these work as expected
model_instance.valid?.should be_false # passes
model_instance.my_field = true
model_instance.valid?.should be_true # passes
model_instance.my_field = false
model_instance.valid?.should be_true # passes
# works as expected
model_instance.my_field = ""
model_instance.valid?.should be_false # passes
# these should pass but fail
model_instance.my_field = "foo"
model_instance.my_field.should == "foo" # fails as well, my_field == false
model_instance.valid?.should be_false # fails
model_instance.my_field = "false"
model_instance.my_field.should == "false" # fails as well, my_field == false
model_instance.valid?.should be_false # fails
model_instance.my_field = "123"
model_instance.valid?.should be_false # fails
model_instance.my_field = "true"
model_instance.my_field.should == "true" # fails as well, my_field == true
model_instance.valid?.should be_false # fails
¿Qué me falta? Parece que el valor se convierte de una manera un tanto lógica, pero ¿dónde y cómo prevenirlo? ¿Cómo hacer este tipo de validación correctamente?
Gracias, no sabía acerca de las constantes 'FALSE_VALUES' /' TRUE_VALUES'. ¡Y su respuesta completa lo explica muy bien! Aprendí algo hoy. – polarblau
Creo que el meme es que cuando un campo booleano tiene validates_presence_of, falla la validación siempre que sea falso. La solución alternativa es usar validates_inclusion_in. Estoy viendo este comportamiento yo mismo en Rails 3.0.9. Vea aquí: http://www.ruby-forum.com/topic/99285 –
Estaba leyendo de nuevo las guías de Rails sobre Validaciones, y me explicó cómo validar un campo booleano. Mi primer instinto fue "¿Por qué validar un booleano, ya que siempre será verdadero o falso y nunca nulo?". Tratando de encontrar razones, me encontré con esta publicación. Creo que el meme comenzó allí con los recién llegados, y se estancó un poco. "Si explican cómo, debería hacerse". Creo que fue explicado por completo ... solo mis 2 centavos valen ... –