content_for与片段缓存结合使用的解决方法

时间:2018-07-20 00:38:57

标签: ruby-on-rails caching ruby-on-rails-5.1 fragment-caching content-for

我正在尝试按每个元素将内容插入页面的头部,因此我希望能够在部分内容中指定类似的内容:

# _partial.html.erb
<%= content_for :style %>
  .element {
    background-color: red;
  }
<% end %>

并将其放在我的页面顶部:

# application.html.erb
<head>
  <style>
    <%= content_for(:style) %>
  </style>
</head>

但是元素部分是片段缓存的,content_for在缓存中被忽略。

Rails文档中指出content_for不适用于片段缓存的工作元素:

WARNING: content_for is ignored in caches. So you shouldn't use it for elements that will be fragment cached. http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for

当前是否有一种方法可以使content_for在Rails 5.1上使用片段缓存?一段时间以来,似乎没有人真正碰过这个问题。有谁知道为什么吗?


这里有一些较早的提及:

Is there a workaround for ignored content_for blocks with caches_action and :layout => false?

content_for works in development but not production?

https://gist.github.com/stackng/891895

https://rails.lighthouseapp.com/projects/8994/tickets/3409-content_for-and-fragment-caching

2 个答案:

答案 0 :(得分:5)

对此有一个Rails拉动请求:https://github.com/rails/rails/pull/39600

希望这很快就会在Rails中“起作用” ...?

免责声明:我已提交此拉取请求

答案 1 :(得分:0)

  

当前是否有一种方法可以使content_for在Rails 5.1上使用片段缓存?

根据设计,在使用缓存时根本不会评估局部变量,因此唯一的解决方案是将content_for结果和“真实”内容一起缓存,就像链接的历史补丁一样。唯一的解决方法是将content_for块移到局部对象之外–说起来容易做起来容易,这很容易理解,并且破坏了首先使用它的意义。

  

似乎有一段时间没有人真正碰过这个问题。有谁知道为什么吗?

看起来这个问题早在很多年前就不为人所知:我在GitHub上根本没有相关的PR。 (我实际上在我的待办事项清单中有关于此的注释,但不知道以前曾做过。)

,没有任何理由未实现此功能(如果8年前有原因,它已经被浪费了一段时间,并且无论如何可能不再适用)。如果有人有兴趣追求PR:请这样做。