在Rails中获取没有指纹的资产URL

时间:2018-02-02 08:56:21

标签: javascript ruby-on-rails

使用javascript_url我们可以获取资产的网址:

&lt;script src="<%= javascript_url 'company_widget' %>"
  token="<%= current_user.token %>"
  class="ofri-company-widget"
&gt;&lt;/script&gt;

但是,javascript_url会返回带指纹的网址:

domain.com/assets/company_widget-<fingerprint>.js

似乎这会永远缓存,每当我们需要在脚本中进行更改时,使用此脚本的第三方都必须重新加载它。

我注意到访问没有指纹的文件也有效:

domain.com/assets/company_widget.js

有没有办法告诉javascript_url不添加指纹?或者在这种背景下还有另一种更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

http://guides.rubyonrails.org/asset_pipeline.html#turning-digests-off

您可以通过更新config / environments / development.rb来关闭摘要以包含:

config.assets.digest = false

答案 1 :(得分:1)

您真正需要做的是在控制器操作中返回您的javascript文件,因此可以控制此特定文件的缓存。

在您的控制器操作中,您应该执行以下操作:

def company_widget
  response.headers["Expires"] = 1.day.from_now.httpdate
  expires_in 1.day, public: true, must_revalidate: true

  format.js do
    asset = open(ActionController::Base.helpers.asset_url('company_widget.js', host: host))
    send_data asset.read, :type => asset.content_type
  end
end

def host
  request.protocol + request.host_with_port
end

然后您可以指向控制器操作,并确保您可以控制返回的内容。

<script src="http://example.com/company_widget.js"></script>

Expires标头是设置缓存的旧方法,而expires_in Rails方法将设置Cache-Control标头,这是管理缓存的最佳方式。它优先于Expires

此外,您还可以查看有关缓存的精彩文章:https://www.mnot.net/cache_docs/