2011-12-19 111 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