如何通过Devise的用户模型访问视图中关联资源的属性?

How to access attributes of associated resource in view through Devise's user model?

我在尝试使用 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 %>

现在,"each" 循环外的 <%= @users.first.profile.first_name %> 运行良好,returns 值,<%= @users.first.profile.first_name %> 循环内 returns 出现以下错误:

NoMethodError: undefined method `first_name' for nil:NilClass

我得出的结论是,这取决于 Devise 以及它如何允许您访问其自身控制器之外的任何关联记录。作为记录,我对其他资源尝试了相同的代码,它按预期工作。

如有任何帮助,我们将不胜感激!

您遍历 users 并调用 .profile.first_name,但您的一些用户没有 .profile,即 nil,这就是您收到的原因:

NoMethodError: undefined method `first_name' for nil:NilClass

简单替换

<li><%= user.profile.first_name %></li>

<li><%= user.profile.try(:first_name) %></li>
如果用户的 .profile 不存在

.try 将 return nil 改为引发异常

或者处理它yourself/show一些消息:

<li><%= user.profile.present? ? user.profile.first_name : "Profile doesn't exist" %></li>