尝试使用Devise在视图中显示用户个人资料属性时遇到问题。这只是为了显示值,我甚至还没有尝试更新它,所以我相信不需要强大的参数。
以下是我的模特:
# user.rb
class User < ActiveRecord::Base
has_one :profile
end
和
# profile.rb
class Profile < ActiveRecord::Base
belongs_to :user
end
这是我的控制器:
# users_controller.rb
class Admin::UsersController < AdminController
def index
@users = User.all.order('id ASC')
end
end
以下是我的观点:
# index.html.erb
<% if @users.present? %>
<p><%= @users.first.profile.first_name %></p>
<ul>
<% @users.each do |user| %>
<li><%= user.profile.first_name %></li>
<% end %>
</ul>
<% end %>
现在,虽然“{”}循环之外的<%= @users.first.profile.first_name %>
运行良好并返回值,但循环内的<%= @users.first.profile.first_name %>
会返回以下错误:
NoMethodError: undefined method `first_name' for nil:NilClass
我得出的结论是,这取决于Devise以及它如何允许您访问其自己的控制器之外的任何相关记录。为了记录,我为其他资源尝试了相同的代码,它按预期工作。
对此的任何帮助都会非常感激!
答案 0 :(得分:1)
您循环浏览users
并致电.profile.first_name
,但您的部分用户没有.profile
,即nil
,这就是您收到的原因:
NoMethodError:nil的未定义方法`first_name':NilClass
简单地替换
<li><%= user.profile.first_name %></li>
与
<li><%= user.profile.try(:first_name) %></li>
如果用户的nil
不存在, .try
将返回.profile
而非异常提升
或者自己处理/显示一些消息:
<li><%= user.profile.present? ? user.profile.first_name : "Profile doesn't exist" %></li>