0

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

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

给定一个生成的资源,如“mobile_v2.js”,我如何查询 Sprockets 以获取该文件的 SHA1 摘要?(来自我的红宝石代码)

4

2 回答 2

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", "")
于 2012-09-01T00:50:20.760 回答
0

要查找生成资产的 sprockets 摘要:

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

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

于 2012-09-02T20:06:07.707 回答