使用stylesheet_link_tag进行Rails 4片段缓存

时间:2014-11-05 02:41:46

标签: ruby-on-rails caching ruby-on-rails-4 memcached sprockets

Rails 4使用cache_digests(https://github.com/rails/cache_digests)来协助片段缓存失效:cache_digests创建模板的MD5哈希及其所有已知依赖项,允许片段缓存通过在模板或模板时分配新密钥而变为无效它的依赖性发生了变化。

我的问题是:如果application.css文件的MD5哈希在stylesheet_link_tag期间发生变化,那么包装rake assets:precompile的片段缓存是否会失效?现在在标题中执行此操作:

<% cache("header-cache-key") do %>
  <%= stylesheet_link_tag "application" %>
  <%= javascript_include_tag "application" %>
<% end %>

这样安全吗?我担心,当CSS或JS发生变化时,application-xxxxxxx.css将变为application-yyyyyyy.css,但我们的标题将使用旧的application-xxxxxxx.css进行缓存。然后,如果application-xxxxxxx.csspublic/assets消失,则会导致页面难看。

1 个答案:

答案 0 :(得分:2)

在编译的CSS / JS的更改中,缓存不会被破坏/无效。

Rails在代码更改时破坏缓存的方式是通过将文件的哈希插入到视图的缓存键中来完成的。

例如,您在app/views/layouts/application.html.erb处有一个视图文件。 Rails根据文件的内容(即HTML / Ruby代码,而不是执行的输出)生成哈希。让我们假设生成的哈希值是&#39; abdefg123&#39;。

如果application.html.erb具有以下缓存代码:

<% cache("header-cache-key") do %>
  <%= stylesheet_link_tag "application" %>
  <%= javascript_include_tag "application" %>
<% end %>

生成的实际缓存密钥是"views/layouts/application-abcdefg123/header-cache-key"行的内容。

由于已编译的CSS / JS中的更改实际上并未更改文件中的Ruby / HTML,因此布局代码的计算哈希值不会发生变化,因此缓存键不会被更改为&#39;头高速缓存密钥&#39;是相同的,意味着缓存没有被破坏。