2013-02-06 14 views
10

Sto scrivendo un'applicazione ricca di Javascript in un progetto Ruby on Rails 3.1 e utilizzo di Handlebars per il mio framework di template JS. Sto cercando di capire un modo per aggiungere dinamicamente il digest MD5 di un asset (generato durante la precompilazione degli asset in produzione) ai miei tag all'interno del mio modello di Handlebars. Spero che ci sia un hash con il percorso asset come chiave e il digest MD5 come valore, ma non sono stato in grado di trovarne uno.Come posso determinare il digest MD5 di una determinata risorsa nella pipeline delle risorse di Rails?

Una soluzione ideale sarebbe passare l'hash da Ruby a Javascript e definire un helper Handlebars che aggiungerà automaticamente il digest MD5 all'attributo "src" dell'asset.

Qualcuno ha tentato di fare qualcosa di simile? Ci deve essere un modo per usare i modelli Javascript in Rails e anche sfruttare i vantaggi del fingerprinting degli asset.

+0

Si tratta di un default nella ENV di produzione [Asset-gasdotto guida] (http://guides.rubyonrails.org/asset_pipeline.html) –

+1

E riguardo l'utilizzo di percorso_asset nella tua risposta JSON? – mathieugagne

risposta

36

Come qualcuno menzionato nei commenti, l'aggiunta di un hash ai percorsi di asset è una parte predefinita della pipeline di asset.

Nella produzione, Rails inserisce un impronta digitale MD5 in ogni nome di file in modo che il file viene memorizzato nella cache dal browser web

Si può leggere di più su impronte digitali nel bene gasdotto here. Rails utilizza Sprockets per compilare le risorse. Le impronte digitali arrivano come parte del processo Sprockets.

È possibile utilizzare il metodo find_asset delle ruote dentate, passando un percorso logico alla risorsa per ottenere un'istanza Sprockets::BundledAsset. Per esempio

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

È possibile chiamare digest_path su questo oggetto per farlo è MD5 somma allegata al bene.

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

Con questa conoscenza è possibile creare facilmente un aiutante per restituire la digest_path per qualsiasi attività nell'applicazione, e chiamare questo helper all'interno dei file .js.erb.

+0

Il metodo find_asset è esattamente quello che stavo cercando e non ho trovato. Grazie mille! –

+0

Perché il percorso digest è diverso da quello nel nome file effettivo? – rardoz

2

Questa è una vecchia questione, ma sembra che al giorno d'oggi è possibile utilizzare assets_manifest:

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

Più discussione qui:. https://github.com/rails/sprockets-rails/issues/311

Problemi correlati