2010-09-06 26 views
9

Estoy bastante confundido sobre cómo validar los valores booleanos en Rspec y Rails. Entiendo que todo excepto false y nil se toman como true en Ruby. Pero cuando uso MySQL con Rails, usa 1 para true y 0 para false (si mi comprensión es correcta).Validación del valor booleano en Rspec y Rails

Tengo las siguientes especificaciones del modelo. Me gustaría probar el valor booleano para el atributo superuser.

  • ¿Cómo puedo escribir especificaciones aquí?
  • ¿Cómo puedo escribir el código de implementación aquí?
  • ¿Mis especificaciones y el código de implementación son específicos de una base de datos específica (como MySQL y PostgreSQL)?

    require 'spec_helper' 
    describe User do 
        before(:each) do 
        @valid_attributes = { 
         :username => "mike", 
         :password => "super_encryped_password", 
         :email => "[email protected]", 
         :superuser => true 
        } 
        end 
    
        it "should create a new instance given valid attributes" do 
        User.create!(@valid_attributes) 
        end 
    
        it "should have true or false for superuser" do 
        @valid_attributes[:superuser] = "hello" 
        User.new(@valid_attributes).should have(1).error_on(:superuser) 
        end 
    end 
    

Respuesta

0

Una cosa importante es que ActiveRecord hace encasillamiento entre bastidores, por lo que no tiene que preocuparse de cómo su base de datos almacena valores booleanos. Ni siquiera necesita validar que un campo sea booleano, siempre que configure ese campo como booleano al preparar su migración. Es posible que desee asegurarse de que el campo no sea nil, con una declaración validates_presence_of :superuser en su clase de modelo.

+0

Esa es la respuesta que quería. No necesito preocuparme mientras establezca el campo booleano. Me alegra oír eso. –

+0

es que lo mismo en columnas de tiempo? –

+0

@TK: exactamente así. – edgerunner

0

Creo que se desee "debe tener verdadera o falsa de superusuario" a fallar. Pero si quieres que falle, se debe añadir una validación en el usuario:

validate :superuser_boolean 

def superuser_boolean 
    errors.add(:superuser, "Should be a boolean") if !superuser.is_a?(TrueClass) && !superuser.is_a?(FalseClass) 
end 
+0

Tu respuesta se ve bastante bien. No se me ocurrió 'is_a? TrueClass'. Lo miraré. –

+0

podría deshacerse del! S si volteó el if a a menos y && a || –

0

Basando fuera la respuesta de jordini:

def superuser_boolean 
    errors.add(:superuser, "Should be a boolean") if [true, false].include?(superuser) 
end 

No hay feos is_a cheques, sólo un simple include?.

+0

¿Qué es 'is_a?' Feo? –

+0

@TK: Sí, ¿y ejecutarlo dos veces es más lento que comprobar una inclusión? una vez. –

+0

Gracias. Agradezco tu respuesta –

0

def boolean? (Val) !! val val == final

incluirlo en su spec_helper o se extienden rspec con be_boolean.

7

Esta es una gran discusión con algunos puntos importantes: Rails valida campos booleanos automáticamente, un valor falso hará que las validaciones de "presencia" fallen, y se necesita una validación personalizada que busque explícitamente configuraciones falsas verdaderas si desea asegurarse un campo booleano no es nulo, pero tiene un verdadero valor verdadero o falso.

Una rápida actualización de los carriles 3.x es el: ayudante de inclusión:

http://guides.rubyonrails.org/active_record_validations_callbacks.html#inclusion

Con esta ayuda, validar que un campo booleano tiene un verdadero o un valor falso se ve así:

validates :superuser, :inclusion => {:in => [true, false], :message => 'requires a true or false value' } 

El mensaje es opcional y, como indica la documentación, el valor predeterminado "no está incluido en la lista".

El consenso en línea parece no ser para molestarse en validar explícitamente para verdadero o falso, sino para dejar que los rieles se encarguen de ello.Me encontré con una situación, sin embargo, donde las validaciones explícitas recogían un problema en la base de datos (los campos tinyint de MySql se establecían en 2 o 4 de longitud en lugar de 1) que causaban un comportamiento extraño. Los campos se pueden establecer en verdadero o falso, pero el valor no se puede leer como un booleano. En otras palabras, la validación de Rails lo pasó, pero la validación de inclusión explícita marcó todos los casos en los que la base de datos se configuró incorrectamente. Así que esta podría ser una buena razón para tomarse la molestia de validar esas entradas. Espero que esto ayude. Charles

+0

Esto parece ser la solución más limpia para mí, sin saltear la validación booleana por completo. Funciona utilizando validaciones incorporadas en los rieles, y debe ser db-agnóstico, mientras detecta cualquier configuración errónea. – sockmonk

Cuestiones relacionadas