当ActiveRecord关联为nil时,Rails会阻止错误

时间:2012-06-12 19:35:24

标签: ruby-on-rails activerecord associations

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

问题在于并非每个用户都被分配到一个组,因此@user.group例如nilNoMethodError: undefined method 'name' for nil:NilClass。所以,我得到一个令人沮丧的{{1}}。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

我通常使用Object#try

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

答案 2 :(得分:0)

我会创建一个名称好的方法,因此重用代码很容易。

def is_assigned?
  self.group
end

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