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).

25
demandé sur Shpigford 2009-11-11 01:02:36

4 réponses

Les paramètres entrent en tant que chaînes, donc vous devez comparer avec "true", pas true.

47
répondu sepp2k 2009-11-10 22:04:21

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
28
répondu toxaq 2017-03-21 20:53:58

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
6
répondu Jake 2017-01-28 00:45:56

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.

5
répondu Ed S. 2009-11-10 22:05:09