我有一部分是我在同一页面上渲染两次,但是在两个不同的位置(一个在标准布局中显示,一个在移动/平板电脑布局期间显示)。
部分在两个地方呈现完全相同,所以我想通过将其作为变量存储来加速它,如果可能的话; partial每次都进行一次API调用,第二次调用完全没必要,因为它与第一次API调用重复。
有没有办法将返回的部分中的HTML存储为变量,然后将其用于两个渲染?
编辑:我希望在没有缓存的情况下这样做,因为这是一个非常简单的需求,我希望保持代码库的精简和可读性。是否可以将partial存储为字符串变量,然后引用两次?
答案 0 :(得分:7)
<% content_for :example do %>
<%= render :your_partial %>
<%end%>
然后在您想要部分调用的地方调用<%= yield :example %>
或<%= content_for :example %>
。
答案 1 :(得分:6)
一种选择是使用片段缓存。使用缓存块包装部分后,第二个调用应显示第一个调用的缓存版本。例如:
<% cache do %>
<%= render(:partial => 'my_partial') %>
<% end %>
... later in the same view ...
<% cache do %>
<%= render(:partial => 'my_partial') %>
<% end %>
要将渲染结果存储到字符串,您可以尝试使用render_to_string
AbstractController
方法。参数与render
相同。
partial_string = render_to_string(:partial => 'my_partial')
答案 2 :(得分:0)
我为这个旧问题添加了答案,因为它在Google刚刚进行的搜索中排名第一。
capture helper(还有一段时间)还有另一种方法。
<% reuse_my_partial = capture do %>
<%= render partial: "your_partial" %>
<% end %>
<div class="visible-on-desktop"
<%= reuse_my_partial %>
</div>
<div class="visible-on-mobile"
<%= reuse_my_partial %>
</div>
这比使用content_for更简单,更安全,因为不涉及其他可能会修改的全局存储。
链接的rails文档使用实例@vars而不是本地vars,因为他们希望其可用于其布局模板。这是您无需担心的细节,因为您正在同一模板文件中使用它。