如何通过Devise的用户模型访问相关资源的属性?

时间:2015-02-12 17:33:55

标签: ruby-on-rails ruby ruby-on-rails-4 model-view-controller devise

尝试使用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以及它如何允许您访问其自己的控制器之外的任何相关记录。为了记录,我为其他资源尝试了相同的代码,它按预期工作。

对此的任何帮助都会非常感激!

1 个答案:

答案 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>