2013-02-06 7 views
10

Ich schreibe eine Javascript-reiche Anwendung in einem Ruby on Rails 3.1 Projekt und benutze Lenker für mein JS Templating Framework. Ich versuche eine Möglichkeit zu finden, den MD5-Digest eines Assets (der während der Vorkompilierung von Assets bei der Produktion generiert wurde) dynamisch an meine Tags innerhalb meiner Handlebars-Vorlage anzuhängen. Ich hoffe, dass es einen Hash mit dem Asset-Pfad als Schlüssel und dem MD5-Digest als Wert gibt, aber ich konnte keinen finden.Wie kann ich den MD5-Digest eines bestimmten Assets in der Rails-Asset-Pipeline ermitteln?

Eine ideale Lösung wäre, den Hash von Ruby in Javascript zu übergeben und einen Handlebars-Helfer zu definieren, der den MD5-Digest automatisch an das "src" -Attribut des Assets anhängt.

Hat jemand versucht, etwas Ähnliches zu tun? Es muss eine Möglichkeit geben, JavaScript-Vorlagen in Rails zu verwenden und die Vorteile des Asset-Fingerprintings zu nutzen.

+0

Es ist ein Standard in der Produktion env [Asset-Pipeline Anleitung] (http://guides.rubyonrails.org/asset_pipeline.html) –

+1

Was ist mit der Verwendung von Asset_Pfad in Ihrer JSON-Antwort? – mathieugagne

Antwort

36

Wie in den Kommentaren erwähnt, ist das Anhängen eines Hashs an die Asset-Pfade ein Standardteil der Asset-Pipeline.

In der Produktion Rails fügt einen MD5-Fingerabdruck in jeden Dateinamen, so dass die Datei vom Web-Browser im Cache gespeichert wird

Sie können in der Asset-Pipeline here mehr über Fingerabdrucks lesen. Rails verwendet Sprockets, um Assets zu kompilieren. Der Fingerabdruck wird im Rahmen des Ritzelprozesses geliefert.

Sie können die find_asset Methode von Ritzeln verwenden und einen logischen Pfad an Ihr Asset übergeben, um eine Sprockets::BundledAsset Instanz zu erhalten. Zum Beispiel

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

Sie können digest_path auf diesem Objekt aufrufen, um es MD5 Summe an den Vermögenswert angehängt zu bekommen ist.

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

Mit diesem Wissen Sie ganz einfach einen Helfer erstellen können die digest_path für einen Vermögenswert in Ihrer Anwendung zurückzukehren, und nennen diese Helfer aus Ihrer .js.erb Dateien.

+0

Die find_asset-Methode ist genau das, was ich suchte und nicht finden konnte. Vielen Dank! –

+0

Warum unterscheidet sich der Digest-Pfad von dem im tatsächlichen Dateinamen? – rardoz

2

Dies ist eine alte Frage, aber es scheint, dass heutzutage kann man assets_manifest verwenden: hier

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

Weitere Diskussion. https://github.com/rails/sprockets-rails/issues/311

Verwandte Themen