4

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

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

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

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

4

3 回答 3

8
<% content_for :example do %>
  <%= render :your_partial %>
<%end%>

然后调用<%= yield :example %><%= content_for :example %>任何你想要你的部分调用的地方。

于 2012-07-19T05:58:12.490 回答
6

一种选择是使用片段缓存。用缓存块包装部分后,第二个调用应该显示第一个的缓存版本。例如:

<% cache do %>
  <%= render(:partial => 'my_partial') %>
<% end %>

... later in the same view ...

<% cache do %>
  <%= render(:partial => 'my_partial') %>
<% end %>

要将渲染结果存储到字符串中,您可以尝试render_to_string. AbstractController参数与 for 相同render

partial_string = render_to_string(:partial => 'my_partial')
于 2012-07-19T03:25:36.207 回答
1

我正在为这个老问题添加一个答案,因为它在我刚刚进行的搜索中超过了谷歌。

现在有另一种方法可以做到这一点(很长一段时间),捕获助手

<% 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 更简单且更安全,因为不涉及其他可能修改的全局存储。

链接到使用实例 @vars 而不是本地变量的 rails 文档,因为他们希望它可用于他们的布局模板。这是您无需担心的细节,因为您在同一个模板文件中使用它。

于 2019-01-19T14:55:03.107 回答