【问题标题】:Prevent caching of a single js file防止缓存单个 js 文件
【发布时间】:2011-12-19 10:23:58
【问题描述】:

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

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

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

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

感谢您的任何建议。

编辑:Done a bit more reading on the asset pipeline

“在服务器启动后的第一个请求上编译和缓存资产。Sprockets 设置了一个必须重新验证的 Cache-Control HTTP 标头以减少后续请求的请求开销——在这些请求上,浏览器会收到 304(未修改)响应.

如果清单中的任何文件在请求之间发生了变化,服务器将响应一个新的编译文件。"

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

【问题讨论】:

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


    【解决方案1】:

    听起来您不想使用资产管道,它正在努力促进缓存。

    与其试图对抗资产管道,不如创建一个实际的控制器,然后您就可以根据自己的喜好设置缓存控制标头。

    如果你在 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 粘贴到 app/views/js 中

    然后你可以链接到它

    = javascript_include_tag settings_js_path
    

    【讨论】:

    • 你知道如何从控制器渲染 js 的好例子吗?我的 .js.erb 文件会存在于 app/views 下吗?如何最好地包含它?我猜 javascript_include_tag 看起来像资产管道, =require 指令也是如此。为这么多问题道歉,做了很多谷歌搜索,找不到很多关于这个的文档......
    • 我已经添加了一些说明
    【解决方案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'
    

    【讨论】:

    • 这是一个javascript文件,在assets目录下。所以AFAIK没有控制器。 Rails 似乎正在缓存服务端文件的第一个版本。
    猜你喜欢
    • 1970-01-01
    • 2020-11-18
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    相关资源
    最近更新 更多