2010-01-21 48 views
0

我做在軌比較PARAMS

if params[:type] = "Type A" 
    # do something 
end 
if params[:type] = "Type B" 
    # do something 
end 

但我認爲這是錯誤的。我應該使用==

然而,讓我錯誤:

你無對象時,你沒想到吧

什麼是軌道要做到這一點的最好方法是什麼?

所有我做是根據它的值從一表格中獲得一個單選按鈕變量和做邏輯(無論是A型或B型)

+0

除非你在這段代碼之前用'params' *做一些奇怪的事情,'nil object'錯誤肯定不是來自比較。它來自第二個區塊發生的情況或兩個區塊都沒有運行的事實。 (當你使用'='時,第一個'if'將總是計算爲'true',所以第一個塊總是被評估。) – 2010-01-22 13:09:14

回答

5

序言

class Hash 
    def try(arg) 
    self[arg] rescue nil 
    end 
end 

你的方式

if params.try(:type) == "Type A" 
    # do 
elsif params.try(:type) == "Type B" 
    # do 
end 

DRY

case params.try(:type) 
when "Type A" 
    # do 
when "Type B" 
    # do 
else 
    # default do 
end 
+1

對於'#try' +1,我忘了它 – MBO 2010-01-21 23:29:46

+0

對象#嘗試在實例上工作的ActiveRecord模型,因爲它們都爲它們所表示的關係的行中的每個字段提供*方法*。但是它不能用於散列,因爲您必須使用散列#[] /散列#獲取來訪問散列內容。 – Caffeine 2010-01-21 23:43:52

+0

解決方案不會拋出異常,因爲'params'確實有'type'方法,其中HashWithdifferentAccess/Hash繼承自Object:它是Object#類的一個不推薦的別名。 請參閱http://ruby-doc.org/core/classes/Object.html#M000349 – Caffeine 2010-01-21 23:55:35

3

你確定它應該是params[:type]?首先,在訪問控制器中的操作之前,檢查日誌以查看params內部的內容。

要檢查多個選擇,你可以使用switch結構:

case params[:type] 
when "Type A" 
    # do sth 
when "Type B" 
    # do sth 
else # not A nor B, can be nil 
    # do nothing 
end 

如果你需要更深層次的內部PARAMS那麼你可以的if/else使用:

if params[:type] && params[:type][:value] == "sth" 
    # do sth 
elsif params[:type] && params[:type][:value] == "..." 
    # do sth 
end 

並檢查你在何處獲得錯誤來自,因爲在Ruby中,您可以輕鬆地比較nil和String,所以這不是因爲在您的示例中使用==