16

我正在 Ruby on Rails 3.1 项目中编写一个富含 Javascript 的应用程序,并将 Handlebars 用于我的 JS 模板框架。我正在尝试找出一种方法,将资产的 MD5 摘要(在生产中的资产预编译期间生成)动态附加到我的 Handlebars 模板内的标签中。我希望有一个以资产路径为键、以 MD5 摘要为值的散列,但我一直找不到。

一个理想的解决方案是将 Ruby 中的哈希值传递到 Javascript 中,并定义一个 Handlebars 助手,该助手会自动将 MD5 摘要附加到资产的“src”属性中。

有没有人试图做类似的事情?必须有一种方法可以在 Rails 中使用 Javascript 模板,并获得资产指纹识别的好处。

4

2 回答 2

44

正如评论中提到的那样,将哈希附加到资产路径是资产管道的默认部分。

在生产环境中,Rails 会在每个文件名中插入一个 MD5 指纹,以便该文件被 Web 浏览器缓存

您可以在此处阅读有关资产管道中指纹识别的更多信息。Rails 使用Sprockets来编译资源。指纹识别是 Sprockets 过程的一部分。

您可以使用 Sprockets 的find_asset方法,将逻辑路径传递给您的资产以获取Sprockets::BundledAsset实例。例如

[1] pry(main)> Rails.application.assets.find_asset('application.js')
=> #<Sprockets::BundledAsset:0x3fe368ab8070 pathname="/Users/deefour/Sites/MyApp/app/assets/javascripts/application.js", mtime=2013-02-03 15:33:57 -0500, digest="ab07585c8c7b5329878b1c51ed68831e">

您可以调用digest_path此对象以将其MD5总和附加到资产。

[1] pry(main)> Rails.application.assets.find_asset('application.js').digest_path
=> "application-ab07585c8c7b5329878b1c51ed68831e.js"

With this knowledge you can easily create a helper to return the digest_path for any asset in your application, and call this helper from within your .js.erb files.

于 2013-02-06T01:50:16.030 回答
6

This is an old question, but it seems that nowadays you can use assets_manifest:

Rails.application.assets_manifest.assets["application.css"] => "application-46ae33e78e504ff295219f41d63c79719d062e48dc0c07bd9b6f7bcad72c6636.css"

More discussion here: https://github.com/rails/sprockets-rails/issues/311

于 2017-07-12T20:27:21.023 回答