Users#index 中的 NoMethodError:未定义的方法“名称”

NoMethodError in Users#index: undefined method `name'

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

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

关系有效,如您在以下查询中所见:

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" =  LIMIT 1  [["id", 4]]
 => "Account A" 

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

好的

<%= user.account_id %>

击倒

<%= user.account.name %>

错误:

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>

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

def index
 @users = User.all
end

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

name 正在应用于 account,它抱怨 accountnil

您会发现,对于 @users 中的一位用户,user.account_id 有效,但 returns 或者 nil(这将在浏览器中显示为空白),或没有 Account 记录的 ID。

如果用户 不需要拥有帐户,您可能应该使用 user.account.try(:name)。 (#try 类似于 #send,但 nil.try returns nil。)

更新:实际上,由于整个 table 单元格是帐户的 link,请改为尝试此操作:

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

抛出错误是因为有些 users 没有关联的 account

如果您正在使用 Rails 3:

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

如果您正在使用 Rails 4:

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