Javascript 在Rails中获取不带指纹的资产url
使用Javascript 在Rails中获取不带指纹的资产url,javascript,ruby-on-rails,Javascript,Ruby On Rails,使用javascript\u url我们可以获得资产的url: <script src="<%= javascript_url 'company_widget' %>" token="<%= current_user.token %>" class="ofri-company-widget" ></script> 这似乎是永久缓存的,每当我们需要在脚本中进行更改时,使用此脚本的第三方都必须重新加载它 我注意
javascript\u url
我们可以获得资产的url:
<script src="<%= javascript_url 'company_widget' %>"
token="<%= current_user.token %>"
class="ofri-company-widget"
></script>
这似乎是永久缓存的,每当我们需要在脚本中进行更改时,使用此脚本的第三方都必须重新加载它
我注意到在没有指纹的情况下访问文件也很有效:
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>