2011-12-19 112 views
3

我的資產目錄中有一個.js.erb文件。這讀取一些特定於語言環境的配置。防止緩存單個js文件

但是,當底層配置更改新文件沒有被提供給我的瀏覽器。我得到304沒有修改。

如果通過添加空格來更改.js.erb文件,則新文件將被正確提供。這樣做,每次我添加配置將是一個痛苦。

有沒有一種方法來配置鋼軌只是爲了不緩存這個特定的文件?

感謝您的任何建議。

編輯:Done a bit more reading on the asset pipeline

「資產被編譯並緩存在服務器啓動後的第一個請求鏈輪設置一個必須重新驗證緩存控制HTTP標頭,以減少對後續請求的請求開銷 - 在這些瀏覽器。獲得304(未修改)響應

如果清單中的任何文件在請求之間發生了變化,服務器將使用新的編譯文件進行響應。

所以這裏的問題是第一個請求被緩存 - 這是一個動態的JavaScript文件。也許唯一的辦法來防止這被緩存內聯的JavaScript?

回答

3

這聽起來像你不想使用資產管道,這是努力促進緩存。

與其試圖對抗資產管道,不如創建一個實際的控制器,然後您可以根據自己的喜好設置緩存控制標題。

如果在app/views/controller_name中有一個js.erb模板,那麼rails應該只顯示它​​。

例如,如果你有一個名爲JsController控制器,你可以在應用中添加

match '/javascripts/settings.js', :controller => :js, :action => :settings, :format => :js, :as => :setting_js 

您的routes.rb文件,然後堅持settings.js.erb /視圖/ JS

然後,您可以鏈接到它

= javascript_include_tag settings_js_path 
+0

你知道如何從控制器呈現js的任何好例子嗎?我的.js.erb文件是否在app/views下生效?如何最好地包含它?我猜javascript_include_tag看起來像資產管道,就像a = require指令一樣。道歉這麼多的問題,做了大量的谷歌搜索,並找不到太多的文件... – Chris 2011-12-20 15:42:44

+0

我已經添加了一些澄清 – 2011-12-20 16:08:13

2

你有沒有在服務該文件的控制器方法中嘗試過類似的東西?

response.headers["Last-Modified"] = Time.now.httpdate 
response.headers["Expires"] = 0 
response.headers["Pragma"] = "no-cache" 
response.headers["Cache-Control"] = 'no-store, no-cache, must-revalidate, max-age=0, pre-check=0, post-check=0' 
+0

這是一個JavaScript文件,在assets目錄下。所以AFAIK沒有控制器。 Rails似乎在緩存服務器端提供的第一個文件版本。 – Chris 2011-12-20 09:24:08