Javascript 在Rails中获取不带指纹的资产url

Javascript 在Rails中获取不带指纹的资产url,javascript,ruby-on-rails,Javascript,Ruby On Rails,使用javascript\u url我们可以获得资产的url: &lt;script src="<%= javascript_url 'company_widget' %>" token="<%= current_user.token %>" class="ofri-company-widget" &gt;&lt;/script&gt; 这似乎是永久缓存的,每当我们需要在脚本中进行更改时,使用此脚本的第三方都必须重新加载它 我注意

使用
javascript\u url
我们可以获得资产的url:

&lt;script src="<%= javascript_url 'company_widget' %>"
  token="<%= current_user.token %>"
  class="ofri-company-widget"
&gt;&lt;/script&gt;
这似乎是永久缓存的,每当我们需要在脚本中进行更改时,使用此脚本的第三方都必须重新加载它

我注意到在没有指纹的情况下访问文件也很有效:

domain.com/assets/company_widget.js
有没有办法告诉
javascript\u url
不要添加指纹?或者在这种情况下还有更好的解决方案吗?

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


config.assets.digest=false

您真正需要做的是在控制器操作中返回您的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
header是设置缓存的旧方法,而
Rails方法中的
Expires\u将设置
cache Control
header,这是管理缓存的最佳方法。它优先于
过期


此外,您还可以阅读一篇关于缓存的优秀文章:

这难道不会关闭所有摘要吗?我真正想要的是将
javascript\u url“company\u widget”
替换为可以解析为相同url但不包含散列的内容。例如,我可以使用字符串方法手动删除哈希,但我只是想知道是否有更好的方法。但是如果没有指纹,浏览器将不会更新您的新代码,直到您删除缓存,对吗?您的文件没有更改->所以您的第三个文件不会重新加载,但也无法获得新的更改?根据文档:“这将导致远程客户端请求内容的新副本。”。有什么理由让你想在rails端处理它吗?嗯,我想至少它不是缓存在服务器上,而是在浏览器中。你认为什么是最好的解决方案?可能会添加一个不缓存文件的路由(例如,
domain.com/api/widget
assets/company_widget.js
)?我不知道该解决方案,但我发现了这个,我认为它可能会帮助您:
<script src="http://example.com/company_widget.js"></script>