2013-04-10 54 views
1

我遍歷Rails模型的實例數組。這裏是我的代碼:Rails 3 - NoMethodError:未定義的方法爲零:每個迭代中的NilClass

product_details.each do |product_detail| 
    product_detail.label = Backend::ProductGroup.where(product_group_number: product_detail.product_group).first.label 

end 

從「product_detail」屬性「標籤」是不是從我的Rails的ActiveRecord模型的屬性。我在我的類定義中添加了attr_accessor。我這樣做,因爲我想動態地添加這個屬性,只有當我需要這樣做。當我在rails控制檯中運行沒有「每個」迭代的代碼時,它工作得很好。但是,當我執行上面的代碼中,我得到了以下錯誤消息:用於無未定義的方法「標籤」:

NoMethodError NilClass

難道我顯然是錯誤的? 非常感謝提前。

回答

1

您可能有幾個product_detail項目沒有匹配product_group。所以在空集合上調用.first返回nil。爲了解決該錯誤,您可以測試PRODUCT_GROUP在繼續之前發現:

product_details.each do |product_detail| 
    product_group = Backend::ProductGroup.where(product_group_number: product_detail.product_group).first 
    product_detail.label = product_group.label if product_group 
end 

你也可以做到這一點更有效地像這樣:

group_labels = BackEnd::ProductGroup. 
       where(product_group_number: product_details.map(&:product_group)). 
       inject({}){|m, g| m[g.product_group_number] = g.label; m} 
product_details.each do |product_detail| 
    product_detail.label = group_labels[product_detail.product_group] 
end 

這將導致在一個數據庫中調用抓住所有相關的組,並將標籤放在密鑰散列中以便於發現和分配。

+0

哇,感謝您的快速和真正有用的答覆,雖然這對我來說有點尷尬,因爲你是完全正確的。 ;) – knoefel 2013-04-10 17:03:58

+0

很抱歉再次打擾您,但爲什麼當我試圖將那些'product_details'作爲json發送給客戶端時,'label'屬性始終爲空?我試圖在渲染動作之前使用'to_json'方法序列化它,但這沒有幫助。它非常好奇,因爲在序列化之前的調試器中,屬性'label'被設置爲正確的值。之後它是空的。我無法將具有動態添加屬性的對象發送給客戶端嗎? – knoefel 2013-04-10 18:48:50

+0

@knoefel:你可以,但這取決於你如何序列化它。默認行爲很可能只序列化表格支持的屬性 - 您需要修改它以達到您的目的。 – PinnyM 2013-04-10 18:51:51

相關問題