2013-02-06 35 views
10

Tôi đang viết một ứng dụng phong phú Javascript trong một dự án Ruby on Rails 3.1 và sử dụng Handlebars cho khuôn khổ JS khuôn mẫu của tôi. Tôi đang cố gắng tìm ra cách để tự động nối thêm bản phân tích MD5 của một nội dung (được tạo trong quá trình biên dịch tài sản vào sản xuất) vào các thẻ bên trong mẫu Handlebars của tôi. Tôi hy vọng rằng có một băm với đường dẫn tài sản là khóa và thông báo MD5 làm giá trị, nhưng tôi đã không thể tìm thấy nó.Làm cách nào tôi có thể xác định thông báo MD5 của một nội dung cụ thể trong đường dẫn nội dung Rails?

Một giải pháp lý tưởng sẽ chuyển mã băm từ Ruby sang Javascript và xác định trình trợ giúp Handlebars sẽ tự động nối thông báo MD5 vào thuộc tính "src" của nội dung.

Có ai đã cố gắng làm điều gì đó tương tự không? Phải có một cách để sử dụng các mẫu Javascript trong Rails và cũng gặt hái những lợi ích của việc lấy dấu tài sản.

+0

Nó là một mặc định trong env sản xuất [Asset-đường ống hướng dẫn] (http://guides.rubyonrails.org/asset_pipeline.html) –

+1

Điều gì về việc sử dụng asset_path trong phản hồi json của bạn? – mathieugagne

Trả lời

36

Khi ai đó được đề cập trong nhận xét, việc thêm băm vào đường dẫn nội dung là phần mặc định của đường dẫn nội dung.

Trong sản xuất, Rails chèn một dấu vân tay MD5 vào mỗi tên tập tin để các tập tin được lưu trữ bởi trình duyệt web

Bạn có thể đọc thêm về dấu vân tay trong các đường ống tài sản here. Rails sử dụng Sprockets để biên dịch nội dung. Dấu vân tay là một phần của quá trình Sprockets.

Bạn có thể sử dụng phương thức find_asset của Sprockets, chuyển một đường dẫn logic đến nội dung của bạn để có được phiên bản Sprockets::BundledAsset. Ví dụ

[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"> 

Bạn có thể gọi digest_path trên đối tượng này để có được nó MD5 sum nối vào tài sản.

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

Với kiến ​​thức này, bạn có thể dễ dàng tạo ra một helper để trả lại digest_path cho bất kỳ tài sản trong ứng dụng của bạn, và gọi helper này từ bên trong .js.erb tập tin của bạn.

+0

Phương pháp find_asset là chính xác những gì tôi đang tìm kiếm và không thể tìm thấy. Cảm ơn nhiều! –

+0

Tại sao đường dẫn thông báo khác với đường dẫn trong tên tệp thực tế? – rardoz

2

Đây là một câu hỏi cũ, nhưng có vẻ như ngày nay bạn có thể sử dụng assets_manifest:

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

Thảo luận nhiều hơn ở đây:. https://github.com/rails/sprockets-rails/issues/311

Các vấn đề liên quan