2013-02-06 41 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