如何解决渲染:集合包装每个项目?
| 目前,我正在使用:<% @items.each do |item| %>
<li class=\"list-item\">
<%= render :partial => \'/widgets/vertical_widget\',:object => item %>
</li>
<% end %>
在页面上渲染大约20个项目(同一页面上还有20个其他小部件)。
当我查看服务器日志时,它显示每个小部件渲染约400ms,该页面总计约20k ms。从我读到的内容来看,使用:colletion而不是使用:object循环可以帮助缩短这些时间,但是我不确定如果使用:collection如何将小部件的每个实例包装在LI中。列表中从来没有将用于窗口小部件的位置放在列表中,因此将LI包含在窗口小部件代码中没有任何意义。
我可以将小部件代码直接包含在循环中,而不是部分包含在其中,但是我不想在多个地方进行代码更新。
任何其他改善性能的想法将不胜感激!
解决方法
试试
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 %>
, 我知道这是一个较晚的答案,但对有类似问题的人可能有用。
Zabba的回答非常好,应该作为一般准则有所帮助。但是,您的速度慢问题可能与渲染无关。如果单个渲染耗时400毫秒,则可能是您在'vertical_widget \'部分内反复命中数据库。检查日志中正在进行的查询,并查看是否可以使用局部变量来缓存任何查询。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。