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
,它抱怨 account
是 nil
。
您会发现,对于 @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) %>
我在用户和帐户之间有关系:
一个用户属于一个帐户。一个帐户可以有很多用户。
关系有效,如您在以下查询中所见:
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
,它抱怨 account
是 nil
。
您会发现,对于 @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) %>