Comment vérifier si un paramètre est vrai ou faux?
C'est vraiment me creuser la tête, mais peut-être que j'essaie de le faire.
Je passe un paramètre via une URL (example.com?debug=true)
Donc, je veux essentiellement dire:
if params[:debug] == true
do xyz
else
do abc
end
Mais pour une raison quelconque, if statement ne fait tout simplement pas comme il semble qu'il le devrait.
Existe-t-il une meilleure façon de faire cette instruction if/else basée sur un paramètre vrai ou faux?
Le paramètre de débogage aura soit une valeur de true, pas de valeur, soit une valeur de false (en ce qui concerne L'URL aller).
4 réponses
Les paramètres entrent en tant que chaînes, donc vous devez comparer avec "true"
, pas true
.
Vous pouvez utiliser la méthode ActiveRecord pour vérifier les valeurs véridiques si vous ne voulez pas réinventer la roue (c'est ce qui est utilisé lors du passage de paramètres 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])
Pourrait valoir la peine d'être enveloppé dans un assistant mais jamais moins c'est assez 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'
Extension Personnalisée
Certaines personnes désapprouvent l'extension des classes de base mais ceci ne correspondre avec le principe DRY.
# config/initializer/boolean.rb
class Boolean
def self.parse(value)
ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
end
end
, Puis utilisé comme
if Boolean.parse(params[:debug])
then xyz
Depuis Rails / ActiveRecord 4.2.0 c'est
if ActiveRecord::Type::Boolean.new.type_cast_from_user params[:debug]
do xyz
else
do abc
end
Dans Rails 5 c'est:
if ActiveModel::Type::Boolean.new.cast params[:debug]
do xyz
else
do abc
end
Mais pour une raison quelconque, if statement ne fait tout simplement pas comme il semble qu'il le devrait.
Je peux presque garantir qu'il fait exactement ce qu'il devrait. Quand les choses n'ont pas de sens, l'une de nos hypothèses est fausse.
La valeur est-elle réellement un booléen ou est-ce une chaîne (ou autre chose?). Si la valeur est une chaîne, alors bien sûr la comparaison avec la valeurbooléenne True échouera. Essayez de comparer à "vrai" et voyez si cela fonctionne.