2012-06-12 43 views
1

我有一個類似「組」的表存儲我的「用戶」可以屬於的組列表。在用戶模型中,這是通過belongs_to :group完成的。在我看來,我想顯示組名稱。我試圖用@user.group.name來做到這一點。Rails防止ActiveRecord協會爲零時的錯誤

問題是,並非每個用戶都被分配到一個組,因此@user.group例如將是nil。所以,我得到了一個令人沮喪的NoMethodError: undefined method 'name' for nil:NilClass

解決此問題的最佳方法是什麼?

回答

3

我通常使用Object#try此:

@user.group.try(:name) # returns nil if @user.group is nil 
4

最簡單的方法是做這樣的事情:

<% if @user.group.present? %> 
    <%= @user.group.name %> 
<% end %> 

然而,根據Law of Demeter,模型應該只談論到它的直接關聯/不應該知道其關聯的方法。

所以,理想情況下,你應該做這樣的事情(在你的用戶模型):

delegate :name, :to => :group, :prefix => true, :allow_nil => true 

然後你就可以通過@user.group_name訪問。如果沒有關聯組,它將返回nil,但不會引發異常。這相當於

def group_name 
    group.try(:name) 
end 
0

我將創建一個方法,一個好名字,所以這將是易於重用的代碼。

def is_assigned? 
    self.group 
end 

<% if @user.is_assigned? %> 
    ... 
<% end %>