2011-11-29 12 views
12

Ho un'app Rails 3.1 che utilizza lo codebrew/backbone-rails. In un modello di .jst.ejs, vorrei includere un'immagine, in questo modo:Rails con backbone-rail: risorse helpers (percorso_immagine) nei file EJS

<img src="<%= image_path("foo.png") %>"/> 

Ma naturalmente gli aiutanti di attività non sono disponibili in JavaScript.

Il concatenamento ERB (.jst.ejs.erb) non funziona, poiché la sintassi EJS è in conflitto con ERB.

Ecco quello che so:

  • Gli helper di attivi non sono disponibili nel browser, quindi ho bisogno di eseguirli sul lato server.
  • Posso aggirare il problema facendo in modo che il server scarichi vari percorsi di asset nell'HTML (tramite attributi di dati o <script> e JSON) e li rilegga in JS, ma questo sembra piuttosto kludgy.

C'è un modo per utilizzare in qualche modo gli ausiliari di risorse nei file EJS?

+0

È inoltre possibile ridefinire i ejs tag (se sono davvero una porta della funzione di template di Underscore come suggerito nei documenti ruby-ejs gem) con '_.templateSettings' [funzione template underscore.js] (http://documentcloud.github.com/underscore/#template), consentendo così di utilizzare '{{code}}' o qualche altro tagging di tua scelta – wulftone

risposta

25

C'è una via, in realtà, per unire un file .jst.ejs.erb, sebbene sia abbastanza non documentato, e l'ho trovato solo esaminando i casi di test EJS. Puoi dire a EJS di utilizzare {{}} (o [%%] o qualsiasi altra cosa desideri) invece di <%%>, quindi ERB non tenterà di valutare le tue chiamate EJS.

Assicurarsi di richiedere EJS da qualche parte nel codice (ho appena incluso gem 'ejs' nel mio Gemfile) e quindi creare un inizializzatore (l'ho chiamato ejs.RB) che include quanto segue:

EJS.evaluation_pattern = /\{\{([\s\S]+?)\}\}/ 
EJS.interpolation_pattern = /\{\{=([\s\S]+?)\}\}/ 

Poi basta assicurarsi di rinominare i modelli per .jst.ejs.erb, e sostituire il <%%> codice EJS-interpretato esistente con {{}}. Se si desidera utilizzare qualcosa di diverso da {{}}, modificare le espressioni regolari nell'inizializzatore.

Vorrei che ci fosse un'opzione in Pignoni per gestire questo attraverso la configurazione piuttosto che dover includere esplicitamente EJS, ma al momento, non c'è modo di farlo che io sappia.

+0

Questo è ESATTAMENTE quello che stavo cercando. Grazie mille per aver postato :) – Kirk

+0

hmm questo non funziona per me, sì ho riavviato le rotaie. semplicemente ignora l'opzione e continua a lavorare con la valutazione/interpolazione predefinita – zanedev

+0

@zanedev dove hai inserito l'opzione? puoi creare un succo? – carpeliam

16

Posso vedere due modi. Nemmeno sono fantastici.

Quando si dice <%%= variable %> allora questo è reso dal ERB come <%= variable %>, così si potrebbe raddoppiare per cento sfuggire tutto ma le asset_tags e che sarebbe sopravvivere al viaggio attraverso uno ERB passare sulla strada per EJS.

Se si scopre che anche lordo ...

Che ne dite di fare un file javascript diverso, con un'estensione ERB, che definisce i percorsi di attività? E quindi utilizzare la pipeline di asset per richiederlo.

così dicono assets.js.erb definisce qualcosa di simile:

MyAssets = { 
    'foo': <%= image_path("foo.png") %>, 
    ... 
} 

E poi richiedono questo da qualche parte vicino alla parte superiore del vostro manifesto. E quindi fare riferimento alle globali comunque che funzionano in EJS.

+0

la migliore opzione finora quella di MyAssets, andando avanti (anche per i18n) – mateusmaso

4

Ryan Fitzgerald è stato così gentile da inviare un succo dei suoi aiutanti di asset JavaScript (che vengono precompilati con ERB): https://gist.github.com/1406349

+0

Questa è una grande idea. Grazie per la pubblicazione. – maxl0rd

+0

L'essenza è fantastica. Ecco la mia forcella semplificata: https://gist.github.com/3879730 –

5

Per coloro che sono disposti a provare HAML invece di EJS: Usando haml-coffee attraverso haml_coffee_assets ha funzionato bene per me anche.

si può avere quanto segue in un file .hamlc.erb:

%img(src="<%= image_path('foo.png') %>") 

(. E ancora non ti dà il routing aiutanti, però, solo i collaboratori attivi)

+0

great, thank you – Hannes

2

È possibile utilizzare corrispondente Javascript aiuto tramite il seguente perla: https://github.com/kavkaz/js_assets

Finalmente (dopo l'installazione e la configurazione) si sarà in grado di utilizzare in questo modo:

<img src="<%= asset_path("foo.png") %>"/> 
Problemi correlati