【问题标题】:How can I determine the MD5 digest of a given asset in the Rails asset pipeline?如何确定 Rails 资产管道中给定资产的 MD5 摘要?
【发布时间】:2017-07-13 04:27:21
【问题描述】:

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

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

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

【问题讨论】:

  • 在生产环境中是默认的。Asset-pipeline guide
  • 在你的json响应中使用asset_path怎么样?

标签: ruby-on-rails ruby md5 asset-pipeline handlebars.js


【解决方案1】:

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

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

您可以阅读有关资产管道中指纹识别的更多信息here。 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"

有了这些知识,您可以轻松地创建一个帮助程序来为应用程序中的任何资产返回 digest_path,并从您的 .js.erb 文件中调用此帮助程序。

【讨论】:

  • find_asset 方法正是我一直在寻找但找不到的方法。非常感谢!
  • 为什么摘要路径与实际文件名不同?
  • 我们可以隐藏指纹吗?
【解决方案2】:

这是个老问题了,不过现在好像可以用assets_manifest

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

更多讨论在这里:https://github.com/rails/sprockets-rails/issues/311

【讨论】:

    猜你喜欢
    • 2012-04-18
    • 2014-11-07
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多