【问题标题】:Rails partial taking too much time to render sometimesRails 部分渲染有时会花费太多时间
【发布时间】:2012-12-26 09:33:34
【问题描述】:

在我看来,我正在渲染部分内容。这实际上是一个在表格中出现大约 500 到 600 次的行元素。我已经急切地加载了所有关联。 但是,问题是,相同的部分有时会出现突然不同的渲染时间。

我的 Rails 服务器 o/p:

Rendered admin/invoices/_update.html.erb (1330.3ms)
Rendered admin/invoices/_update.html.erb (4.8ms)
Rendered admin/invoices/_update.html.erb (4.8ms)
Rendered admin/invoices/_update.html.erb (8.8ms)
Rendered admin/invoices/_update.html.erb (4.4ms)
Rendered admin/invoices/_update.html.erb (1309.9ms)
Rendered admin/invoices/_update.html.erb (4.7ms)
Rendered admin/invoices/_update.html.erb (4.6ms)
Rendered admin/invoices/_update.html.erb (4.6ms)
Rendered admin/invoices/_update.html.erb (1322.6ms)
Rendered admin/invoices/_update.html.erb (4.2ms)

此外,没有特定的行每次都需要更长的时间。

在我的视图文件中:

<% @updates.each do |update| %>
<%= render :partial => 'update', :locals => {:user => update[0]} #each of this is  a row %>
<% end %>

更新: 还建议这是否是一个好方法?即:循环一个部分这么多次。我不能使用分页和 Ajax 来固定东西。!还有其他方法吗?

【问题讨论】:

    标签: ruby-on-rails-3 ruby-on-rails-3.1 partial-views renderpartial


    【解决方案1】:

    Partials 在渲染集合时非常有用。当您通过 :collection 选项将集合传递给部分时,部分将为集合中的每个成员插入一次:

    <%= render :partial => 'update', :collection => @updates %>
    

    这也有一个简写。假设 @updates 是更新实例的集合,您可以简单地将其写入 index.html.erb 以产生相同的结果:

    <%= render @updates %>
    

    Section 3.4.5 of the Rails Guides 详细解释了这一点。

    【讨论】:

      【解决方案2】:

      虽然我不确定为什么渲染中的延迟会出现峰值,但我强烈建议颠倒顺序:您将所有更新都提供给部分,然后在其中迭代并渲染行。

      在视图文件中

          <%= render :partial => 'update', :locals => {:updates => @updates} %>
      

      在更新部分里面

          <% updates.each do |update| %>
             RENDER LOGIC
          <% end %>
      

      这就是为什么您不会为更新中的每一行承受部分加载开销。希望这会有所帮助!

      【讨论】:

      • 嘿,谢谢。我试过了,渲染立即下降了大约 15% - 20%。但是仍然无法理解这些不规则尖峰的原因。
      • 您的结果来自开发环境吗?请记住,在生产中,视图代码被缓存,因此其他建议可能在性能方面更有意义。尝试在生产环境中进行基准测试,因为最终渲染时间很重要。
      • 启用资产流水线,预编译资产,哇哦,页面就在那里!闪电快!谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多