在同一页面上多次渲染rails部分

时间:2012-07-19 03:04:28

标签: ruby-on-rails partial-views render

我有一部分是我在同一页面上渲染两次,但是在两个不同的位置(一个在标准布局中显示,一个在移动/平板电脑布局期间显示)。

部分在两个地方呈现完全相同,所以我想通过将其作为变量存储来加速它,如果可能的话; partial每次都进行一次API调用,第二次调用完全没必要,因为它与第一次API调用重复。

有没有办法将返回的部分中的HTML存储为变量,然后将其用于两个渲染?

编辑:我希望在没有缓存的情况下这样做,因为这是一个非常简单的需求,我希望保持代码库的精简和可读性。是否可以将partial存储为字符串变量,然后引用两次?

3 个答案:

答案 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,因为他们希望其可用于其布局模板。这是您无需担心的细节,因为您正在同一模板文件中使用它。