Параметр :layout обычно используется с :action или одиночным :partial, но не с :collection. Проблема: yield вызывается для каждого элемента в списке.
Вам придется просмотреть исходники, чтобы понять, почему :layout и :collection ведут себя таким образом; но достаточно сказать, что ваш код, вероятно, следует просто переписать, чтобы он не полагался на совместную работу :layout и :collection.
Вот один из способов сделать это, предполагая, что повторное использование этого кода в других представлениях имеет высокий приоритет. Если вы не используете большое количество кэширования, рендеринг каждой части будет довольно медленным, особенно если в вашей новостной_ленте много элементов, поэтому я объединил их в один.
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} %>
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>
Если рендеринг целой кучи партиалов вас устраивает с точки зрения времени выполнения, вам может показаться, что эта реализация views/news/_news_feed.html.erb
лучше:
<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 />
Таким образом, вместо рендеринга :layout вы рендерите один большой партиал, обертывающий коллекцию.
person
Tim Snowhite
schedule
05.02.2010