2009-11-10 56 views
24

這確實是在絞盡腦汁,但也許我正在努力。如何檢查參數是真是假?

我通過URL傳遞一個參數(example.com?debug=true)

所以我基本上是想說:

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

但無論出於何種原因,如果只是聲明ISN」不喜歡它似乎應該做的事情。

有沒有更好的方法來做到這一點,如果基於param是真的還是假的/ else語句?

調試參數的值可能爲true,沒有值或值爲false(只要URL發生變化)。

回答

43

params以字符串形式出現,因此您需要與"true"進行比較,而不是true

+0

這是問題...不能用來比較的字符串。 – Shpigford 2009-11-10 22:07:47

+0

另一種解決方案是檢查是否存在'if params [:debug] .present?' – SparK 2016-05-31 14:28:23

+0

@Dty對於'nil'和'false'方法'.present?'返回'false'。這與'.blank?'完全相反。 – SparK 2016-07-18 16:49:45

5

但是,無論出於什麼原因,如果陳述只是不這樣做似乎應該。

我幾乎可以保證它正在做它應該做的。當事情沒有意義時,我們的一個假設是錯誤的。

該值實際上是一個布爾值還是字符串(或其他?)。如果該值是一個字符串,那麼當然與布爾值的值比較將失敗。嘗試與'真'比較,看看是否有效。

+0

矛盾不存在。每當你認爲你面臨矛盾時,請檢查你的房屋。你會發現其中一個是錯誤的。 (: – 2016-04-18 23:29:16

24

你可以使用檢查真實值的ActiveRecord的方法,如果你不想重新發明輪子(這是幹什麼用的傳遞一個ActiveRecord對象

鋼軌內側PARAMS當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]) 

也許值得包裝的幫手,但從未這是相當靈活的少:

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' 

自定義擴展

有人在擴展核心類皺眉,但這符合DRY原則。

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

然後使用像

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

看來,這不是公共API的一部分,因爲Rails 4:http://api.rubyonrails.org/ – 2014-02-17 11:43:08

+0

看起來還在那裏給我https://github.com/rails/rails/blob/2eae0e80c1916b7cb2e0122f919ef44bb0597fde /activerecord/lib/active_record/connection_adapters/column.rb#L194 – toxaq 2014-02-17 21:02:26

6

由於軌道/ ActiveRecord的4.2。0是

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

在Rails五是:

if ActiveModel::Type::Boolean.new.cast params[:debug] 
    do xyz 
else 
    do abc 
end 
相關問題