代码之家  ›  专栏  ›  技术社区  ›  True Soft

在Ruby on Rails中呈现部分集合正在乘法项

  •  2
  • True Soft  · 技术社区  · 14 年前

    我想在RubyonRails的页面中显示一个项目列表。我使用偏音

    在我的 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
    %>
    

    在里面 _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次。

    我的代码有什么问题?

    2 回复  |  直到 14 年前
        1
  •  7
  •   Tim Snowhite    14 年前

    :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>
    

    如果对运行时间而言,呈现一整串部分是可以的,那么您可能会发现 视图/news/\u news\u 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 />

    因此,不渲染:布局,而是渲染一个包装集合的大部分。