2009-11-10 11 views
24

Das ist wirklich mein Gehirn, aber vielleicht versuche ich zu hart.Wie überprüft man, ob ein Parameter wahr oder falsch ist?

Ich bin ein param über eine URL (example.com?debug=true) vorbei

Deshalb möchte ich im Grunde sagen:

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

Aber aus welchem ​​Grund auch immer, dass, wenn Aussage isn nur‘ t tun wie es scheint, wie es sollte.

Gibt es eine bessere Möglichkeit, die if/else-Anweisung basierend auf einem param wahr oder falsch zu tun?

Der Debug-Parameter hat entweder den Wert true, keinen Wert oder den Wert false (sofern die URL angegeben wird).

Antwort

43

Params kommen als Strings, also müssen Sie gegen "true", nicht true vergleichen.

+0

, dass das Problem war ... wurde nicht als String zu vergleichen. – Shpigford

+0

eine andere Lösung ist es zu prüfen, ob es vorhanden ist, wenn params [: debug] .präsentieren? ' – SparK

+0

@Dty Für' nil' und 'false' die Methode' .präsentiert '' gibt 'false' zurück. Es ist das genaue Gegenteil von '.blank?'. – SparK

5

Aber aus welchem ​​Grund auch immer, wenn Anweisung einfach nicht tut, wie es scheint, wie es sollte.

Ich kann fast garantieren, dass es genau das tut, was es sollte. Wenn die Dinge keinen Sinn ergeben, ist eine unserer Annahmen falsch.

Ist der Wert tatsächlich ein boolescher Wert oder ist es ein String (oder etwas anderes?). Wenn der Wert eine Zeichenkette ist, dann wird natürlich der Vergleich mit dem booleschen Wert true fehlschlagen. Versuchen Sie, mit 'wahr' zu vergleichen und sehen Sie, ob das funktioniert.

+0

Widersprüche existieren nicht. Wann immer Sie denken, dass Sie einem Widerspruch gegenüberstehen, überprüfen Sie Ihre Räumlichkeiten. Du wirst feststellen, dass einer von ihnen falsch ist. (: –

24

Sie könnten Active Methode der Überprüfung wahrheitsgemäße Werte verwenden, wenn Sie das Rad neu erfinden nicht wollen (das ist, was verwendet wird beim Passieren params innerhalb eines Activerecord-Objekt

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

könnte in einem Helfer wert Verpackung sein, aber nie weniger ist es recht flexibel:

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' 

Individuelle Verlängerung

Einige Leute Kern-Klassen über die Verlängerung aber dieses Stirnrunzeln entspricht dem DRY-Prinzip.

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

verwendet dann wie

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

) Es scheint, dass dies nicht Teil der öffentlichen API wie von Rails 4 ist: http://api.rubyonrails.org/ –

+0

Sieht immer noch da zu mir https://github.com/rails/rails/blob/2eae0e80c1916b7cb2e0122f919ef44bb0597fde /activerecord/lib/active_record/connection_adapters/column.rb#L194 – toxaq

6

Da Rails/Activerecord 4.2.0 ist

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

In Rails 5 ist:

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