2009-11-10 6 views
24

C'est vraiment énervant mon cerveau, mais peut-être que j'essaie de dur.Comment vérifier si un param est vrai ou faux?

Je passe une via une URL param (example.com?debug=true)

Je veux essentiellement dire:

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

Mais pour quelque raison que si la déclaration juste n » t faire comme il semble qu'il devrait le faire.

Existe-t-il une meilleure façon de faire cela si l'instruction/else basée sur un param est vrai ou faux?

Le paramètre debug aura soit la valeur true, soit aucune valeur, soit la valeur false (pour autant que l'URL soit valide). Params viennent en tant que chaînes, de sorte que vous devez comparer "true", pas true

Répondre

43

+0

C'était le problème ... ne comparait pas comme une chaîne. – Shpigford

+0

une autre solution est de vérifier sa présence 'si params [: debug] .present?' – SparK

+0

@Dty Pour 'nil' et' false' la méthode '.present?' Retourne 'false'. C'est exactement le contraire de '.blank?'. – SparK

5

Mais pour une raison quelconque, si la commande ne fonctionne pas comme elle le devrait.

Je peux presque garantir qu'il fait exactement ce qu'il devrait. Lorsque les choses n'ont pas de sens, l'une de nos hypothèses est fausse.

La valeur est-elle réellement une valeur booléenne ou est-ce une chaîne (ou autre chose?). Si la valeur est une chaîne alors bien sûr la comparaison à la valeur booléenne true échouera. Essayez de comparer à «vrai» et voir si cela fonctionne.

+0

Les contradictions n'existent pas. Chaque fois que vous pensez que vous faites face à une contradiction, vérifiez vos locaux. Vous constaterez que l'un d'eux a tort. (: –

24

Vous pouvez utiliser la méthode de ActiveRecord de vérifier les valeurs véridiques si vous ne voulez pas de réinventer la roue (ce qui est ce qui est utilisé lors du passage params dans un objet ActiveRecord

Rails 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]) 

Rails 5

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

Pourraient terminerons valeur dans une aide, mais jamais moins il est assez souple:

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' 

extension personnalisée

Certaines personnes froncent les sourcils sur l'extension des classes de base, mais cette correspond au principe DRY.

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

ensuite utilisé comme

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

Il semble que cela ne fait pas partie de l'API publique de Rails 4: http://api.rubyonrails.org/ –

+0

Il semble toujours là pour moi https://github.com/rails/rails/blob/2eae0e80c1916b7cb2e0122f919ef44bb0597fde /activerecord/lib/active_record/connection_adapters/column.rb#L194 – toxaq

6

Depuis Rails/ActiveRecord 4.2.0 il est

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

Dans Rails 5, il est:

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