2010-02-05 23 views
2

我想在Ruby-on-Rails的頁面中顯示項目列表。我用我的index.html.erb文件諧音在Ruby on Rails中呈現部分集合正在乘以項目

我:

<%= @lista = News.find(:all, :order => Document::COL_DATE + ' DESC, id DESC') 
    render :partial => "newsitem", 
      :layout => "list_news", 
      :spacer_template => "spacer", 
      :collection => @lista 
%> 

_list_news.html.erb我:

<div class="news"> 
    <%= yield %> 
</div> 

_spacer.html.erb<hr/>

_newsitem.html.erb

<%= newsitem_counter + 1 %> 
<!-- Code to print details for one item --> 

的問題是,它多次打印列表:

如果列表中的3項,就說明他們3次:1,2,3,1,2,3,1,2,3。
如果它有7個項目,這些項目打印7次。

我的代碼有什麼問題?

+0

在您的視圖代碼中粘貼一些日誌記錄,以查看重複調用的內容。 – klochner 2010-02-05 20:14:52

回答

7

The:layout選項通常用於:action或single:partial,而不是:collection的。問題是:列表中的每個項目都會調用yield。

您必須查看源代碼才能找出原因:layout和:collection以這種方式運行;但足以說你的代碼應該被重寫,以便它不依賴於:layout和:collection一起工作。

以下是您可以這樣做的一種方法,假設在其他視圖中重複使用此代碼是高優先級。除非您使用大量緩存,否則渲染每個部分的速度往往相當緩慢,特別是如果您的news_feed包含很多項目,那麼我已將其整合爲一個。

controller/news_controller.rb

class NewsController < ApplicationController 
    def index 
    @news_feed = News.find(:all, 
          :order => Document::COL_DATE + ' DESC, id DESC') 
    end 
end 

views/news/index.html.erb

<%= render :partial => "news_feed", 
     :locals => { :news_feed => @news_feed} %> 

<ul class="news"> 
    <% news_feed.each_with_index do |news_item, news_item_counter| %> 
    <li> 
     <%= newsitem_counter + 1 %> 
     <%# Code to print details for one item %> 
    </li> 
    <% end %> 
</ul> 

如果渲染一大堆泛音是好的爲您在運行時明智的,你可能會發現這個實現的更好:

<div class="news"> 
    <%= render :partial => 'news_item', :collection => news_feed, :spacer_template => "horizontal_break" %> 
</div> 

views/news/_news_item.html.erb

<%= newsitem_counter + 1 %> 
<%# Code to print details for one item %> 

views/news/_horizontal_break.html.erb

<hr />

因此,而不是渲染:佈局,您呈現一個大的部分,它封裝集合。

+0

這就是我在看到你發表回覆時所寫的內容 - 而你的內容比我的內容更詳細。 +1。 – 2010-02-05 20:58:28

+0

感謝您的詳細解答。我使用第一種方法。 – 2010-02-05 21:29:24