Rails 4片段缓存与stylesheet_link_tag

8
Rails 4使用cache_digests(https://github.com/rails/cache_digests)来帮助片段缓存失效:cache_digests会创建一个模板及其所有已知依赖项的MD5哈希,当模板或其依赖项更改时,它允许片段缓存通过分配新键来失效。我的问题是:如果在rake assets:precompile期间应用程序.css文件的MD5哈希值发生更改,那么包装stylesheet_link_tag的片段缓存是否会失效?现在我们在头部执行此操作:
<% 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。然后如果 public/assets 中没有了 application-xxxxxxx.css,这将导致页面出现问题。

1个回答

2

不,缓存不会在编译的CSS/JS更改时被清除/失效。

Rails在代码更改时清除缓存的方式是将文件的哈希值插入到视图的缓存键中。

例如,假设您有一个位于app/views/layouts/application.html.erb的视图文件。Rails从文件内容(即HTML/Ruby代码,而不是执行输出)生成哈希值。让我们假设生成的哈希值为“abdefg123”。

如果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,因此布局代码的计算哈希值不会改变,因此“header-cache-key”的缓存键保持不变,这意味着缓存没有被清除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接