【问题标题】:Render :collection wrap each item?渲染:集合包装每个项目?
【发布时间】:2012-06-05 00:23:54
【问题描述】:

目前我正在使用:

<% @items.each do |item| %>
  <li class="list-item">
    <%= render :partial => '/widgets/vertical_widget',
               :object => item %>
  </li>
<% end %>

在一个页面上呈现大约 20 个项目(同一页面上还有另外 20 个不同的小部件)。

当我查看我的服务器日志时,它显示每个小部件呈现约 400 毫秒,页面总计约 20k 毫秒。从我读过的内容来看,使用 :colletion 而不是使用 :object 的循环应该有助于改善这些时间,但是我不确定如果我使用 :collection,如何将小部件的每个实例包装在 LI 中。从来没有将网站上使用的小部件放在列表中,因此在小部件代码中包含 LI 是没有意义的。

我可以将小部件代码直接包含在循环中而不是部分中,但是我不想在多个地方进行代码更新。

任何其他提高性能的想法都将不胜感激!

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    试试content_tag

    #some_file.html.erb
    
    <ul>
    <%= render :partial => 'widgets/vertical_widget', 
               :collection => @items, 
               :locals => { :wrap_in => :li } %>
    </ul>
    
    
    
    #/widgets/vertical_widget.html.erb
    
    #First, render and capture the content once.
    <% @rendered_content = capture do %>
      #render the item here
    <% end %>
    
    #Next, decide if the content rendered above should be wrapped in a tag or not
    #If the "wrap_in" variable was passed-in and it is not nil/empty, then use that
    #value for the tag; else do not wrap the content in a tag
    <% if defined?(wrap_in) && !wrap_in.blank? %>
      <%= content_tag wrap_in do %>
        <%= @rendered_content %>
      <% end %>
    <% else %>
        <%= @rendered_content %>
    <% end %>
    

    【讨论】:

    • 我有点希望得到部分之外的东西,但我认为这仍然可以解决我的问题。我下班回家试试看!
    • 嗯,您可以使用间隔模板 (:spacer =&gt; 'some_spacer_template_file') 来渲染“打开”标签(模板为 &lt;/li&gt;&lt;li&gt; - 请注意“反转" 标签) - 然后在集合渲染调用中添加 &lt;li&gt;&lt;/li&gt; - 但这是“错误的”和丑陋的,并且可能(?)导致其他问题。
    • 您的代码运行良好,不幸的是我的缓慢问题仍然存在。还是谢谢!
    【解决方案2】:

    我意识到这是一个较晚的答案,但它可能对有类似问题的人有用。

    Zabba 的回答非常好,应该作为一般指导方针有所帮助。但是,您的缓慢问题可能与渲染无关。如果单个渲染需要 400 毫秒,那么您很可能在“vertical_widget”部分内重复访问数据库。检查您的日志以了解正在进行的查询,看看您是否可以使用局部变量缓存其中的任何内容。

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 1970-01-01
      • 2013-07-13
      • 2022-11-14
      • 1970-01-01
      • 2014-11-09
      • 2011-12-19
      • 1970-01-01
      • 2021-04-03
      相关资源
      最近更新 更多