2009-11-10 14 views
24

Esto realmente me está destrozando el cerebro, pero tal vez estoy tratando de hacerlo difícil.¿Cómo verificar si un parámetro es verdadero o falso?

estoy pasando un parámetro a través de una dirección URL (example.com?debug=true)

Así que básicamente quiere decir:

if params[:debug] == true 
do xyz 
else 
do abc 
end 

Pero por alguna razón que si declaración que acaba de ISN' t haciendo lo que parece que debería.

¿Hay una manera mejor de hacer que la instrucción if/else basada en un param sea verdadera o falsa?

El parámetro de depuración tendrá un valor verdadero, sin valor o falso (en lo que respecta a la URL).

Respuesta

43

los parámetros vienen como cadenas, por lo que debe comparar con "true", no true.

+0

Ese era el problema ... no estaba comparando como una cadena. – Shpigford

+0

Otra solución es verificar su presencia 'si params [: debug] .present?' – SparK

+0

@Dty Para 'nil' y' false' el método '.present?' Devuelve 'false'. Es exactamente lo contrario de '.blank?'. – SparK

5

Pero por el motivo que sea, si la afirmación simplemente no funciona como debería.

Casi puedo garantizar que está haciendo exactamente lo que debería. Cuando las cosas no tienen sentido, una de nuestras suposiciones es incorrecta.

¿El valor es en realidad un booleano o es una cadena (u otra cosa?). Si el valor es una cadena, por supuesto, la comparación con el valor booleano verdadero fallará. Intente comparar con 'verdadero' y vea si eso funciona.

+0

Las contradicciones no existen. Cuando creas que estás enfrentando una contradicción, revisa tus premisas. Descubrirá que uno de ellos está mal. (: –

24

Se podría utilizar el método de comprobación de valores veraces de ActiveRecord si no quiere reinventar la rueda (esto es lo que se utiliza al pasar parametros dentro de un objeto ActiveRecord

rieles 3-4.1

if ActiveRecord::ConnectionAdapters::Column.value_to_boolean(params[:debug]) 
    do xyz 
else 
    do abc 

Rails 4.2.0

ActiveRecord::Type::Boolean.new.type_cast_from_database(params[:debug]) 

rieles 5

ActiveModel::Type::Boolean.new.cast(params[:debug]) 

podría ser digno de envoltura en un ayudante, pero nunca lo menos es bastante flexible:

rails c 
Loading development environment (Rails 3.2.6) 
1.9.3p194 :001 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean '1' 
=> true 
1.9.3p194 :002 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean '0' 
=> false 
1.9.3p194 :003 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean 1 
=> true 
1.9.3p194 :004 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean true 
=> true 
1.9.3p194 :005 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean 'true' 
=> true 
1.9.3p194 :006 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean 'on' 
=> true 
1.9.3p194 :007 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean 'off' 

extensión personalizada

Algunas personas fruncir el ceño en la ampliación de las clases básicas pero esto encaja con el principio DRY.

# config/initializer/boolean.rb 
class Boolean 
    def self.parse(value) 
    ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value) 
    end 
end 

luego se usa como

if Boolean.parse(params[:debug]) 
    then xyz 
+0

Parece que esto no forma parte de la API pública de Rails 4: http://api.rubyonrails.org/ –

+0

Aún me queda allí https://github.com/rails/rails/blob/2eae0e80c1916b7cb2e0122f919ef44bb0597fde /activerecord/lib/active_record/connection_adapters/column.rb#L194 – toxaq

6

Desde Rails/ActiveRecord 4.2.0 es

if ActiveRecord::Type::Boolean.new.type_cast_from_user params[:debug] 
    do xyz 
else 
    do abc 
end 

En los carriles 5 que es:

if ActiveModel::Type::Boolean.new.cast params[:debug] 
    do xyz 
else 
    do abc 
end 
Cuestiones relacionadas