在Ruby on rails上渲染部分集合正在增加项目

Tru*_*oft 2 collections renderpartial ruby-on-rails

我想在Ruby-on-Rails中显示页面中的项目列表.我使用偏爱

在我的index.html.erb文件中我有:

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

_list_news.html.erb我有:

<div class="news">
  <%= yield %>
</div>
Run Code Online (Sandbox Code Playgroud)

_spacer.html.erb 我有<hr/>

_newsitem.html.erb我有

<%= newsitem_counter + 1 %>
<!-- Code to print details for one item -->
Run Code Online (Sandbox Code Playgroud)

问题是它多次打印列表:

如果列表有3个项目,则显示3次:1,2,3,1,2,3,1,2,3.
如果它有7个项目,那么这些项目将被打印7次.

我的代码有什么问题?

Tim*_*ite 7

:layout选项通常用于:action或one:partial,而不是:collection's.问题是:为列表中的每个项目调用yield.

您必须查看源代码以找出原因:布局和:集合以这种方式运行; 但足以说你的代码应该只是被重写,以便它不依赖于: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
Run Code Online (Sandbox Code Playgroud)

views/news/index.html.erb

<%= render :partial => "news_feed",
       :locals => { :news_feed => @news_feed} %>
Run Code Online (Sandbox Code Playgroud)

views/news/_news_feed.html.erb

<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>
Run Code Online (Sandbox Code Playgroud)

如果渲染一大堆部分对于你的运行时间是合适的,你可能会发现这个views/news/_news_feed.html.erb更好的实现:

<div class="news">
  <%= render :partial => 'news_item', :collection => news_feed, :spacer_template => "horizontal_break" %> 
</div>
Run Code Online (Sandbox Code Playgroud)

views/news/_news_item.html.erb

<%= newsitem_counter + 1 %>
<%# Code to print details for one item %>
Run Code Online (Sandbox Code Playgroud)

views/news/_horizontal_break.html.erb

<hr />

因此,不是渲染:layout,而是渲染一个包裹集合的大部分.