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

Workaround for content_for use in conjunction with fragment caching

我试图在每个元素的基础上将内容插入到我的页面的头部,所以我希望能够在部分中指定这样的内容:

# _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

Is there currently a way to get content_for to work with fragment caching on Rails 5.1?

根据设计,使用缓存时根本不会评估部分,因此唯一的解决方案是将 content_for 结果与 'real' 内容一起缓存,作为链接的历史记录补丁做了。唯一的 变通方法 是将 content_for 块移到部分之外——可以理解,这说起来容易做起来难,而且首先破坏了使用它的意义。

No ones seems to have really touched this issue for a while. Does anyone know if there's a reason why?

看起来这个问题在很多年前就被忽视了:我在 GitHub 中根本看不到任何相关的 PR。 (实际上,我在个人待办事项列表中有关于此的注释,但不知道以前有人处理过它。)

没有,没有理由没有实现此功能(如果 8 年前有一个原因,它已经消失在时间的流沙中——和无论如何可能不再适用)。如果有人有兴趣追求 PR:请做。

现在有 Rails 个打开的拉取请求:https://github.com/rails/rails/pull/39600

希望这将 "just work" 很快在 Rails 中...

免责声明:我提交了这个拉取请求