1

我有一个像“组”这样的表,它存储了我的“用户”可以属于的组列表。在 User 模型中,这是通过belongs_to :group. 在我看来,我想显示组名。我正在尝试使用@user.group.name.

问题是不是每个用户都被分配到一个组中,@user.group例如nil. 所以,我得到了一个NoMethodError: undefined method 'name' for nil:NilClass令人沮丧的结果。

解决此问题的最佳方法是什么?

4

3 回答 3

4

最简单的方法是执行以下操作:

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

但是,根据得墨忒耳法则,模型应该只与它的直接关联/不应该知道它的关联方法。

所以,理想情况下,你应该做这样的事情(在你的用户模型中):

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

然后您可以通过@user.group_name. nil如果没有关联的组,它将返回,但不会引发异常。这相当于

def group_name
  group.try(:name)
end
于 2012-06-12T19:39:03.100 回答
4

我通常为此使用Object#try

@user.group.try(:name) # returns nil if @user.group is nil
于 2012-06-12T19:39:48.970 回答
0

我会创建一个名字好听的方法,这样就很容易重用代码。

def is_assigned?
  self.group
end

<% if @user.is_assigned? %>
  ...
<% end %>
于 2012-06-12T19:45:58.750 回答