2011-01-17 12 views
5

Sto costruendo un'applicazione javascript-heavy rails 3. Usa underscore.js, che ha un meccanismo di template molto elegante costruito su ejs (http://embeddedjs.com/).Incorporamento di un modello ejs all'interno di un modello ERB

Il problema: embeddedjs prende molto a prestito dalla sintassi erb, quindi includere i modelli di ejs in un modello erb causa problemi di rendering con la vista.

C'è un modo per includere sezioni "non-erb" in un file ERB? Questo mi permetterebbe di definire i modelli di ejs all'interno dei file ERB. In questo momento sto usando un hack in cui ho un helper che legge il contenuto non elaborato di un file contenente i modelli di ejs, e che emette come una stringa grezza nel modello erb.

+1

In haml questo sarebbe facile con il filtro ': plain'. http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#plain-filter – Heikki

risposta

3

Io uso questo trucco per risolvere il problema:

// Using custom tags to be able to use regular for templates in templates 
var ejs = require('ejs'); 
ejs.open = '{{'; 
ejs.close = '}}'; 

// Using html extension for custom ejs tags 
app.register('.html', ejs); 

app.set('views', __dirname + '/views'); 
app.set('view engine', 'html'); 

Questo cambia <%%> a {{}}, e mi ha lasciato usare <%%> per i modelli che vengono utilizzati da JS. Questo funziona per me poiché non ho modelli di stile classici (<%%>).

Se ne possiedi molti potresti voler fare lo stesso trucco ma per i modelli underscore.js.

+0

Questo è esattamente quello che voglio, ma non sono sicuro di come legarlo a Rails. (Non sto usando underscore, solo EJS e JST.) – carpeliam

+0

Ho appena trovato la soluzione al mio problema: assegna EJS.evaluation_pattern a/\ {\ {([\ s \ S] +?) \} \}/E EJS .interpolation_pattern a/\ {\ {= ([\ s \ S] +?) \} \}/in un inizializzatore. – carpeliam

2

È possibile salvare ejs come file separato e renderlo come testo (che non verrà valutato come erb) all'interno del tag dello script.

All'interno della vostra erb parziale:

<script id="my_awesome_template" type="text/x-ejs"> 
    <%= render :text => File.open("app/views/controller_name/_my_awesome_template.html.ejs").read %> 
</script>` 

Nel file JavaScript:

new EJS({element: document.getElementById('my_awesome_template')}).render(data) 
2

fuga le variabili di sottolineatura: (Quelli che non si desidera erb di interpolare)

<%= foo %> becomes: 

<%%= foo %> 
Problemi correlati