防止缓存单个js文件

时间:2011-12-19 10:23:58

标签: ruby-on-rails ruby-on-rails-3.1 asset-pipeline

我的资产目录中有一个.js.erb文件。这将读取一些特定于语言环境的配置

但是,当底层配置更改时,新文件未提供给我的浏览器。我没有修改304。

如果我通过添加空格更改.js.erb文件,则会正确提供新文件。每次添加配置时都这样做会很痛苦。

有没有办法配置rails只是为了不缓存这个特定的文件?

感谢您的任何建议。

修改:Done a bit more reading on the asset pipeline

“在服务器启动后,第一个请求上的资产被编译和缓存.Sprockets设置必须重新生效的Cache-Control HTTP头以减少后续请求的请求开销 - 这些浏览器获得304(未修改)响应

如果清单中的任何文件在请求之间发生了变化,服务器将使用新的编译文件进行响应。“

所以这里的问题是第一个请求被缓存 - 这是一个动态的javascript文件。也许是防止这种缓存内联javascript的唯一方法吗?

2 个答案:

答案 0 :(得分:3)

听起来你并不想使用资产管道,而资产管道正在努力推广缓存。

不是试图打击资产管道,而是创建一个实际的控制器,然后您就可以根据自己的喜好设置缓存控制头。

如果app / views / controller_name中有js.erb模板,那么rails应该只渲染它。

例如,如果您有一个名为JsController的控制器,则可以添加

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

到您的routes.rb文件,然后在app / views / js中粘贴settings.js.erb

然后您可以使用

链接到它
= javascript_include_tag settings_js_path

答案 1 :(得分: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'