2012-06-12 44 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 %>