Rails 4使用cache_digests(
https://github.com/rails/cache_digests)来协助片段高速缓存失效:cache_digests创建模板的MD5散列及其所有已知的依赖关系,允许片段高速缓存通过在模板或其依赖关系更改时分配新密钥而变为无效.
我的问题是:如果application.css文件的MD5哈希在rake资产期间发生变化,那么包装stylesheet_link_tag的片段缓存是否会失效: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.css从public / assets中消失,这将导致页面难看.
解决方法
在编译的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”的缓存键是相同的,意味着缓存没有被破坏.