用户中的NoMethodError #index:未定义的方法`name'

时间:2016-03-13 20:50:55

标签: ruby-on-rails ruby ruby-on-rails-4 associations

我在用户和帐户之间有关系:

用户属于某个帐户。一个帐户可以有很多用户。

正如以下查询中所见,这种关系有效:

2.1.4 :010 > User.last.account.name
  User Load (2.0ms)  SELECT  "users".* FROM "users"  WHERE "users"."deleted_at" IS NULL  ORDER BY "users"."id" DESC LIMIT 1
  Account Load (2.4ms)  SELECT  "accounts".* FROM "accounts"  WHERE "accounts"."deleted_at" IS NULL AND "accounts"."id" = $1 LIMIT 1  [["id", 4]]
 => "Account A" 

但是,如果我显示用户的索引视图,当我尝试显示帐户名称时出现错误:

<%= user.account_id %>

KO

<%= user.account.name %>

ERROR:

NoMethodError in Users#index
undefined method `name' for nil:NilClass

<tbody>
             <% @users.each do |user| %>
               <tr>
                 <td><a href="/accounts/<%= user.account_id %>"><%= user.account.name %></a></td>

3 个答案:

答案 0 :(得分:1)

name已应用于account,并且抱怨accountnil

您会发现,对于@users中的某个用户,user.account_id有效,但会返回nil(在浏览器中显示为空白)或ID为没有Account记录。

如果用户不是必需拥有帐户,则应该使用 user.account.try(:name) 。 (#try#send类似,但nil.try返回nil。)

更新:实际上,由于整个表格单元格是该帐户的链接,请尝试以下方式:

<td>
  <% if user.account %>
    <%# user.account definitely exists if you get into this block. %>
    <%= link_to user.account.name, user.account %>
  <% end %>
</td>

答案 1 :(得分:1)

错误正在抛出,因为有些users没有关联account

如果您使用Rails 3

 <%= user.account.name if user.account.present? %>

如果您使用Rails 4

<%= user.account.try(:name) %>

答案 2 :(得分:-1)

您需要在控制器中定义@users。我没有看到你的控制器,但我想是这样的:

def index
 @users = User.all
end

错误告诉您名称正在返回&#39; nil&#39;。每个用户都有account.name吗?我首先添加&lt;%= user.account.name rescue nil%&gt;并查看是否显示任何帐户名称。