1

我有一个帐户和场所表,其中一个帐户可以有许多场所。

我在帐户索引页面上将所有帐户显示为部分帐户,并希望每个帐户都包含与其链接的场所的名称。

这是我所拥有的:

帐户部分

<%= 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 部分

<%= venue.name %>

我收到此错误:

帐户中的 NoMethodError#index

nil:NilClass 的未定义方法“场地”

提取的源代码(第 12 行附近):

12: <%= 渲染 :partial => 'venues/account_venue', :collection => @account.venues %>

任何帮助将非常感激!

编辑

account_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 4 次(有 4 个帐户记录)如果我添加一个新帐户记录它显示单词 test 5 次。

4

2 回答 2

2

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

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

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

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

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

编辑三:既然您已经发布了控制器和部分代码,有几件事很突出;当使用集合渲染部分时,部分内的结果对象从部分而不是集合派生其名称。从Rails 指南

“当使用复数集合调用部分时,部分的各个实例可以通过以部分命名的变量访问正在呈现的集合的成员。”

在你的部分_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 %>

希望这可以帮助!

于 2012-06-13T23:03:39.410 回答
0

看起来你没有分配@account任何东西。应该free_account改为这个吗?

于 2012-06-13T22:53:33.493 回答