使用sprockets时,我有一个完整的.coffee文件目录,这些文件可以转换,合并在一起并成为'mobile_v2.js'。当这个文件被提供时,使用内容的SHA1哈希设置一个精彩的ETag。这允许缓存破坏和其他一切美妙和良好的工作正常。即,如果我修改任何源.coffee文件并重新加载页面,Sprockets将重新生成'mobile_v2.js'并将其发送到客户端。如果我不进行任何更改,客户端将使用该资源的缓存副本。这很有效。
现在我有一个网站应用程序的一部分使用Backbone.js的情况,用户可以在一个页面上花费很长时间,而无需进行完整的“刷新”...即很多很多AJAX更新,但没有新的“......”。从字面上看,客户可以在这个页面上花费数周时间。因此,如果我将更新推送到JS / CSS资源,我需要一种方法让客户端检测到这一点并触发整个页面的重新加载。完全重新加载是破坏性的,所以我不想经常这么做。我也不想在服务器上轮询这些资源......我有所有这些AJAX调用,所以我可以用一个额外的响应头来捎带这些调用。我能做的一切。我只需要一个简单的问题帮助:
鉴于生成的资源如'mobile_v2.js',如何查询Sprockets以获取该文件的SHA1摘要?(来自我的ruby代码)
答案 0 :(得分:1)
不确定我是否帮助您,但如果您正在预编译您的资产,一种方法是从生成的manifest.yml中提取摘要
manifest = YAML.load(File.open(Rails.root.join("public", "assets", "manifest.yml")))
digest = manifest["mobile_v2.js"].gsub("mobile_v2-", "").gsub(".js", "")
答案 1 :(得分:0)
查找生成资产的链轮摘要:
Rails.application.assets.find_asset(asset_name).digest
在生产中,没有sprockets(*),因此我们使用git修订版(我们使用.git文件夹进行部署)。或者,我想我们可以按照DavidO的建议阅读manifest.yaml。
以下是我最终使用的完整解决方案:
def asset_digest(asset_name)
if Rails.env == 'production'
# Production
Git.open(Rails.root).object('HEAD').sha
else
# Development / Test
Rails.application.assets.find_asset(asset_name).digest
end
end
(*):实际上,在生产中,链轮线“工作”,但它是通过重新编译所有资产而不是读取预编译资产来实现的。