如何通过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>
我在尝试使用 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>