2014-11-05 87 views
6

Rails 4使用cache_digests(https://github.com/rails/cache_digests)來協助片段緩存失效:cache_digests創建模板及其所有已知依賴項的MD5哈希,允許片段緩存由於分配新密鑰而失效模板或其依賴項更改。Rails 4使用stylesheet_link_tag緩存片段

我的問題是:如果application.css文件的MD5哈希值在rake assets:precompile期間發生變化,分段緩存是否會打包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中。那麼如果application-xxxxxxx.csspublic/assets消失,這將導致一個醜陋的頁面。

回答

1

沒有緩存將不會被編譯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」是一樣的,這意味着緩存沒有被破壞。