2013-02-06 38 views
10

我在Ruby on Rails 3.1项目中编写了一个Javascript丰富的应用程序,并为我的JS模板框架使用了Handlebars。我试图找出一种方法来动态地将资产的MD5摘要(在资产预编译过程中生成)附加到我的Handlebars模板中的标记中。我希望有资产路径作为关键字和MD5摘要作为值的散列,但我一直无法找到。如何确定Rails资产管道中给定资产的MD5摘要?

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

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

+0

它是在生产ENV一个默认的[资产管道指南](http://guides.rubyonrails.org/asset_pipeline.html) –

+1

在你的json响应中使用asset_path怎么样? – mathieugagne

回答

36

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

在生产中,Rails的插入一个MD5指纹为每个文件名,以便该文件是由Web浏览器

您可以在资产管道here阅读更多关于指纹缓存。 Rails使用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" 

有了这些知识,你可以很容易地创建一个帮助从您的.js.erb文件内归还digest_path任何资产在你的应用程序,并调用这个帮手。

+0

find_asset方法正是我正在查找和找不到的。非常感谢你! –

+0

为什么摘要路径与实际文件名中的路径不同? – rardoz

2

这是一个老问题,但似乎现在你可以使用assets_manifest

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

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