Rails如何显示父对象的属性

时间:2015-10-01 23:52:29

标签: ruby-on-rails

我正在尝试使用Rails 4制作应用程序。

我有2个表 - user.rb和profile.rb。

User has one profile
Profile belongs to User

用户具有名为first_name和:last_name

的字符串属性

在我的个人资料展示视图中,我有这一行:

<%= "#{@profile.user.first_name} #{@profile.user.last_name}" %>

我现在正尝试使用以下元素制作个人资料索引视图页:

 <% Profile.all.sort_by(&:created_at).in_groups_of(3) do |group| %>
      <div class="row">
        <% group.compact.each do |profile| %>
            <div class="col-md-4">
              <div class="indexdisplay">
              <%= image_tag profile.image_url, width: '100%', height: '200px' if profile.image.present? %>
                  <div class="indexheading"> <%= link_to "#{@profile.user.first_name} #{@profile.user.last_name}" %>, profile %> </div>
                   </div>
            </div>
              <% end %>
              </div>

    <% end %>

我收到错误,说:

undefined method `user' for nil:NilClass

我不明白该行在show视图中如何正常工作,但在索引视图中不起作用。我也不明白为什么它认为用户是一种方法。它是一张桌子。

2 个答案:

答案 0 :(得分:2)

您正在user上调用方法@profile。是的,它是一个相关的记录,但它是一个方法调用。问题是你在实例变量@profile上调用它,因为提供的信息不存在。调用时不存在的实例变量返回nil。在nil上调用方法会导致您遇到错误消息。

<%= "#{@profile.user.first_name} #{@profile.user.last_name}" %>的父循环包装是profilegroup的每个循环。将变量@profile替换为变量profile。这应该可以解决您的问题。

答案 1 :(得分:2)

  

未定义的方法`user'代表nil:NilClass

为了给您更多上下文,此错误表示您的变量未填充数据

我写这个是因为这是大多数新Ruby开发人员都没有意识到的问题 - 这不是变量的“方法”错误,而是变量本身不存在。

因为Ruby是面向对象的,所以它会将变量分配给text area以便填充它。因此,不是说变量不存在,而是说你在没有数据的变量上调用未定义的方法。

要解决此问题,您必须确保已正确填充变量。

<强>修复

  

我现在正在尝试创建个人资料索引视图页

控制器中填充数据,而非您的观点:

NilClass

-

这是你的问题。

#app/controllers/profiles_controller.rb class ProfilesController < ApplicationController def index @profiles = Profile.all.order :created_at end end #app/views/profiles/index.html.erb <% @profiles.in_groups_of(3) do |group| %> ... <% end %> 不存在时,您正在呼叫。

请改为:

@profile