2013-03-13 160 views
6

我讀過很多帖子,文章和問題& Rails資產管道 的回答,但我仍然沒有想出如何完全關閉緩存。預防Rails 3.2.11資產管道緩存?

我們使用的是Rails 3.2.11,在我們的Lab環境中(類似於開發),我們遇到了問題,因爲即使我們沒有預先編譯或資產管道中的指紋資產,它們仍然被緩存Rails(Rack?)緩存。這很煩人,因爲一些資產是基於其他配置而改變的ERB,所以緩存變得陳舊。爲了儘量關閉緩存我們設置這樣的配置:

config.action_controller.perform_caching = false 

    config.assets.compress = false 

    config.assets.debug = true 

    # just in case 
    config.cache_store = :file_store, "file_cache" 

然而,資產沒有顯示在tmp/cache/assets反正。我至少希望他們出現在file_cache,但我真的希望他們不要被緩存。

我們如何防止這些資產被緩存?在這種環境下僅僅刪除緩存是不夠的。

紅利問題:只要這些文件被緩存,爲什麼他們在tmp/而不是在file_cache/

回答

8

要關閉資產緩存:

config.assets.cache_store = :null_store 

注意,那就是配置。 資產 .cache_store不是Rails config.cache_store。

還要注意的是薩斯在tmp/cache/sass對編譯的樣式單獨的緩存,默認情況下,如果要禁用,你必須做的分別:

config.sass.cache = false 

要回答獎金問題,當Rails Guide說:

默認的Rails緩存存儲將鏈輪用於緩存資產的開發和生產。

我以爲他們意味着配置 Rails的緩存存儲將被使用。我錯了,它使用默認緩存,除非您明確更改資產緩存。

+0

如果有人因爲他們的資產沒有像更新時那樣使緩存無效而在這裏尋找,我通過從我的開發配置文件中刪除'config.assets.digest = true'來解決這個問題。 – mltsy 2014-01-08 18:54:28

-1

要完全禁用資產管道,您可以在您的環境文件中添加此指令:

config.assets.enabled = false 

但是,如果你仍然想享受資產管道編譯和緩存的靜態JS和CSS,並在同一您可以創建一個my_assets_controller併爲該控制器創建提供動態內容的視圖(擴展名爲.css.erb.js.erb的文件)。你只需要包含在你的視圖或佈局文件中<%= javascript_path '/my_assets/things_dynamically_generated.js' %>

+0

我們希望從實驗室的資產管道中唯一能夠找到文件系統中的資產,但在生產中我們希望所有的緩存。爲了解決自動(失敗)緩存問題,我們不希望重新構建資產。 – 2013-03-13 18:11:43

-1

這聽起來像一個XY問題。

原理1:構建必須是確定性的,並且不依賴於每個環境的配置。

原則2:靜態資產編譯必須是構建的一部分。

您應該轉向擁有純靜態資產。您可以使用ERB,但只是調用asset_path這樣的方法,這些方法是確定性的,並且給出相同的代碼庫會產生相同的結果。只有在所有部署(dev,test,staging,qa,pre-prod和prod)中的數據或行爲相同時,纔可以將基於配置的數據或行爲放在那裏。

任何來自每個環境配置的東西都不應該進入靜態資產。相反,您可以在HTTP標頭,<html>元素上的屬性或其他注入技術中提供。靜態資產代碼應該足夠聰明,可以在HTTP頭或屬性中查找注入的數據,並根據注入的數據改變其行爲。

至於獎勵問題,config.cache_store不是sprocket,sass,compass等高速緩存的控制配置項。

+0

我不同意原則1和原則2,這些都不回答如何禁用資產管道緩存的問題。 – 2013-03-13 17:51:05