如何显示子记录列表?

时间:2012-06-13 22:46:44

标签: ruby-on-rails activerecord parent-child partial-views

我有一张帐户和场地表,帐户可以有很多场地。

我将所有帐户显示为帐户索引页面上的部分帐户,并希望每个帐户都包含与其关联的地点的名称。

继承我所拥有的:

帐户部分

<%= link_to free_account do %>      
    <div class="account_partial">          
      <span class="account_header"><%= free_account.name %></span> - <span class="free_account_highlight">(<%= free_account.role %>)</span><br>

      <%= render :partial => 'venues/account_venue', :collection => @account.venues %>
    </div>
<% end %>

account_venue partial

<%= venue.name %>

我收到了这个错误:

  

帐户#index

中的NoMethodError      

未定义的方法`场地'为零:NilClass

     

提取的来源(第12行):

     

12:&lt;%= render:partial =&gt; '场地/ account_venue',   :collection =&gt; @ account.venues%&gt;

非常感谢任何帮助!

修改

accounts_controller

    class AccountsController < ApplicationController   
    load_and_authorize_resource  

      def index
        @accounts = Account.all(:include => :venues)
      end      
    end

帐户index.html.erb

<div id="narrow_container">
  <div class="free_accounts_container">
    <h2 class="show_orange">Free accounts</h3>  
    <%= render :partial => 'free_account', :collection => @accounts %>
  </div>

  <div class="premium_accounts_container">
    <h2 class="show_orange">Premium accounts</h3>
    <%= render :partial => 'premium_account', :collection => @accounts %><br><br>
  </div>

  <div class="clearall"></div>

  <div class="button">
    <%= link_to 'add account', new_account_path %>
  </div>
</div>

_free_account.html.erb

<%= link_to free_account do %>
  <% if free_account.role == "free" %>
    <div class="account_partial">

      <span class="account_header"><%= free_account.name %></span> - <span class="free_account_highlight">(<%= free_account.role %>)</span><br>

      <div class="owner_details">
        <span class="pre_account_highlight">Owners username:</span><span class="account_highlight"><%= free_account.user.username %></span>
        <span class="pre_account_highlight">Owners e-mail:</span><span class="account_highlight"><%= free_account.user.email %></span>
      </div>

      <div class="account_details">     
      </div>

      <%= render :partial => 'venues/account_venue', :collection => @account.venues %>
    </div>
  <% else %>         
  <% end %>
<% end %>

更新

如果我将部分调用更改为:

<%= render :partial => 'venues/account_venue', :collection => @accounts %>

并且account_venue部分只是读取'test'它加载没有错误,但显示单词test 4次(theres 4 account records)如果我添加一个新的帐户记录,它会显示单词test 5次。

2 个答案:

答案 0 :(得分:2)

您需要将@account设置为控制器中的某个内容,并且该模型实例应该连接到(或包含)Venues模型。像这样:

@account = Account.find(params[:id], :include => :venues)

编辑:我认为您已经使用has_many和belongs_to关系设置了帐户和Venue模型?

编辑二:我现在看到您正在尝试访问帐号#index,在这种情况下,上面的代码应该更改为类似的内容(因为我们没有查看某个特定帐户):

@accounts = Account.all(:include => :venues)

编辑三:既然您已经发布了控制器和部分代码,那么一些事情也很突出;使用集合渲染部分时,部分内部的结果对象从部分而不是集合派生其名称。来自Rails Guides

  

“当使用复数集合调用partial时,则为   部分的个别实例可以访问该成员   通过以partial命名的变量呈现集合。“

在您_account_venue.html.erb的部分<%= venue.name %>中,您需要将其更改为<%= account_venue.name %>

其次,在_free_account.html.erb中,您调用account_venue部分,您指的是名为@account的集合对象 - 这是从哪里来的?由于free_account部分使用集合调用,因此您应该使用的对象将被称为free_account - 实际上您之前在同一部分中使用此名称引用它当你做<%= free_account.name %>时。因此,渲染部分调用应如下所示:

<%= render :partial => 'venues/account_venue', :collection => free_account.venues %>

希望这有帮助!

答案 1 :(得分:0)

看起来你没有为任何事情分配@account。这应该是free_account吗?