如何获取Sprockets生成的资源的摘要?

时间:2012-08-31 23:06:06

标签: ruby-on-rails ruby ruby-on-rails-3 hash sprockets

使用sprockets时,我有一个完整的.coffee文件目录,这些文件可以转换,合并在一起并成为'mobile_v2.js'。当这个文件被提供时,使用内容的SHA1哈希设置一个精彩的ETag。这允许缓存破坏和其他一切美妙和良好的工作正常。即,如果我修改任何源.coffee文件并重新加载页面,Sprockets将重新生成'mobile_v2.js'并将其发送到客户端。如果我不进行任何更改,客户端将使用该资源的缓存副本。这很有效。

现在我有一个网站应用程序的一部分使用Backbone.js的情况,用户可以在一个页面上花费很长时间,而无需进行完整的“刷新”...即很多很多AJAX更新,但没有新的“......”。从字面上看,客户可以在这个页面上花费数周时间。因此,如果我将更新推送到JS / CSS资源,我需要一种方法让客户端检测到这一点并触发整个页面的重新加载。完全重新加载是破坏性的,所以我不想经常这么做。我也不想在服务器上轮询这些资源......我有所有这些AJAX调用,所以我可以用一个额外的响应头来捎带这些调用。我能做的一切。我只需要一个简单的问题帮助:

鉴于生成的资源如'mobile_v2.js',如何查询Sprockets以获取该文件的SHA1摘要?(来自我的ruby代码)

2 个答案:

答案 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

(*):实际上,在生产中,链轮线“工作”,但它是通过重新编译所有资产而不是读取预编译资产来实现的。