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 %>

ただし、デメテルの法則によれば、モデルはその直接の関連付けとのみ対話する必要があり、その関連付けのメソッドについては認識すべきではありません。

したがって、理想的には、( User モデルで) 次のようにする必要があります。

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

からアクセスできます@user.group_namenil関連付けられたグループがない場合は返されますが、例外は発生しません。これは

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 に答える