Pregunta

Tengo una aplicación Rails 3.1 que usa la Codebrew/Backbone-Rails. En una plantilla .jst.ejs, me gustaría incluir una imagen, como así:

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

Pero, por supuesto, los ayudantes de activos no están disponibles en JavaScript.

El encadenamiento ERB (.jst.ejs.erb) no funciona, porque la sintaxis EJS entra en conflicto con ERB.

Esto es lo que sé:

  • Los ayudantes de activos no están disponibles en el navegador, por lo que necesito ejecutarlos en el lado del servidor.
  • Puedo solucionar el problema haciendo que el servidor arroje varias rutas de activos en el HTML (a través de atributos de datos o <script> y json) y leerlos en JS, pero esto parece más bien Kludgy.

¿Hay alguna manera de usar de alguna manera los ayudantes de activos en los archivos EJS?

¿Fue útil?

Solución

En realidad, hay una manera de encadenar un archivo .jst.ejs.erb, aunque es bastante indocumentado, y solo lo encontré mirando los casos de prueba de EJS. Puede decirle a EJS que use {{}} (o [ % %] o lo que desee) en lugar de < % %>, y luego ERB no intentará evaluar sus llamadas EJS.

Asegúrese de requerir EJ en algún lugar de su código (acabo de incluir gem 'ejs' En mi GemFile), y luego cree un inicializador (lo llamé EJS.RB) que incluye lo siguiente:

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

Luego, asegúrese de cambiar el nombre de sus plantillas a .jst.ejs.erb y reemplace su código existente < % %> EJS interpretado con {{}}. Si desea usar algo más que {{}}, cambie las expresiones regulares en el inicializador.

Desearía que hubiera una opción en Spockets para manejar esto a través de la configuración en lugar de tener que incluir explícitamente EJS, pero a partir del momento, no hay forma de hacer eso que yo sepa.

Otros consejos

Puedo ver dos formas. Tampoco son geniales.

Cuando tu dices <%%= variable %> Entonces esto es representado por ERB como <%= variable %>, para que puedas el doble de por ciento escapar de todo pero Los activos_tags y eso sobrevivirían al viaje a través de un pase ERB en el camino a EJS.

Si lo encuentras demasiado asqueroso ...

¿Qué tal hacer un archivo JavaScript diferente, con una extensión ERB, que define sus rutas de activos? Y luego use la tubería de activos para exigir eso.

Así que di assets.js.erb Define algo como:

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

Y luego requiere esto en algún lugar cerca de la parte superior de su manifiesto. Y luego haga referencia a los globales, sin embargo, eso funciona en EJS.

Para aquellos dispuestos a probar Haml en lugar de EJS: usando hamlfoffee mediante haml_coffee_assets También me ha funcionado bien.

Puede tener lo siguiente en un archivo .hamlc.erb:

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

(Sin embargo, todavía no te da ayudantes de enrutamiento, solo ayudantes de activos).

Ryan Fitzgerald tuvo la amabilidad de publicar una esencia de sus ayudantes de activos de JavaScript (que se precompilan con ERB): https://gist.github.com/1406349

Puede usar JavaScript Helper correspondiente a través de la siguiente gema:https://github.com/kavkaz/js_assets

Finalmente (después de instalar y configurar) podrá usarlo así:

<img src="<%= asset_path("foo.png") %>"/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top