2014-03-25 64 views
1

我得到「名爲id爲無..」錯誤,當我嘗試以下分配:分配對象,如果沒有的變量值爲零

@selected = @items_design.items_categories[0].id 

我想要做的就是分配

@selected = nil if @items_design.items_categories[0].id == nil 

我嘗試這樣做:

@selected = @items_design.items_categories[0].id || nil 

和一些其他的嘗試,但沒有運氣的。每次都有相同的錯誤。

+0

如果不是'nil'..then?也對這個問題感到困惑。給出完整的錯誤堆棧。 –

+0

如果它不是零,那麼我想它是@ items_design.items_categories [0] .id – isea

+0

的值您要檢查'nil'值測試... –

回答

1

Ruby告訴你@ items_design.items_categories [0]是nil。這個怎麼樣:

@selected = 
    if @items_design.items_categories[0] 
    @items_design.items_categories[0].id 
    else 
    nil 
    end 

或者這樣:

@selected = @items_design.items_categories[0] ? @items_design.items_categories[0].id : nil 

編輯:添加從註釋的另一選項,這是一種更甜蜜的途徑(感謝丹尼爾!):

@selected = @items_design.items_categories[0] && @items_design.items_categories[0].id 
+0

我更喜歡第一個選項,它是一個非常棒的Rubyism。後者有點「meh」,因爲三元組很粗糙。 – Dan

+2

我不同意,三元陳述很好,很短:)。儘管最後一個可以縮短'@selected = @ items_design.items_categories [0] && @ items_design.items_categories [0] .id'。如果第一部分是'nil',那將是表達式的結果。 –

+0

謝謝,大腦放屁我也嘗試了第二種解決方案,但忘記從三元組的第一部分刪除.id。無法弄清楚爲什麼它不起作用。 – isea

0

問題是@ items_design.items_categories [0]是零。所以你可以試試這個

@selected = nil 
@selected = @items_design.items_categories[0].id unless @items_design.items_categories[0].nil 
+2

'如果X not nil'不是有效的語法。你可以做'除非X.nil?'或者如果不是X.nil?' –

+0

這就是同時使用Ruby和Python的問題:)謝謝Daniel –

0

您必須確保對象@items_design.items_categories[0]本身不是nil,然後將id消息發送到該對象。這就是爲什麼你的「喜歡做」版本將不起作用,因爲它仍然發送id消息到一個對象,最終結果爲nil。這將工作

@selected = nil if @items_design.items_categories[0].nil? 

但它仍然不是你想要的。試試這樣的:

@selected = @items_design.items_categories[0].nil? ? nil : @items_design.items_categories[0].id 

if @items_design.items_categories[0].nil? 
    @selected = nil 
else 
    @selected = @items_design.items_categories[0].id 
end 

你的第二次嘗試

@selected = @items_design.items_categories[0].id || nil 

不工作,因爲你總是發送id消息到陣列的結果,即使是零。

+0

我們可以通過將任務放在''if'''塊之外來幹掉你的第三個例子。 – Dan

+0

當然。但我認爲OP將從儘可能簡單的代碼中受益。隨後的Ruby成語。我喜歡丹尼爾的版本和三元版本。 – Fred