2011-01-17 22 views
5

Estoy compilando una aplicación javs-heavy rails 3. Utiliza underscore.js, que tiene un mecanismo de plantillas muy elegante construido sobre ejs (http://embeddedjs.com/).Incrustar una plantilla ejs dentro de una plantilla erb

El problema: embeddedjs toma mucho de la sintaxis erb, por lo que incluir plantillas ejs en una plantilla erb causa problemas de representación con la vista.

¿Hay alguna manera de incluir secciones "no erb" en un archivo erb? Esto me permitiría definir las plantillas ejs dentro de los archivos erb. En este momento estoy usando un hack donde tengo un helper que lee el contenido sin procesar de un archivo que contiene plantillas ejs, y lo muestra como una cadena sin formato en la plantilla erb.

+1

En haml esto sería fácil con el filtro ': plain'. http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#plain-filter – Heikki

Respuesta

3

Puedo usar este truco para resolver el 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'); 

Esto cambia <%%> a {{}}, y me deja utilizar <%%> para las plantillas que son utilizados por JS. Esto funciona para mí ya que no tengo plantillas de estilo clásico (<%%>).

Si tiene muchos de ellos es posible que desee hacer el mismo truco, pero para las plantillas de underscore.js.

+0

Esto es exactamente lo que quiero, pero no estoy seguro de cómo vincular esto con Rails. (No estoy usando subrayado, solo EJS y JST.) – carpeliam

+0

Acabo de encontrar la solución a mi problema: asignar EJS.evaluation_pattern a/\ {\ {([\ s \ S] +?) \} \}/Y EJS .interpolation_pattern a/\ {\ {= ([\ s \ S] +?) \} \}/en un inicializador. – carpeliam

2

Puede guardar ejs como un archivo separado y luego representarlo como un texto (que no se evaluará como erb) dentro de la etiqueta del script.

Dentro de su erb parcial:

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

En el archivo JavaScript:

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

escape variables Guión: (Los que no desea erb para interpolar)

<%= foo %> becomes: 

<%%= foo %> 
Cuestiones relacionadas