2011-11-13 24 views
48

Tengo un controlador de rieles en el que me he fijado una variable de instancia -¿Cómo acceder a las variables de instancia en el interior del motor CoffeeScript una plantilla Delgado

@user_name = "Some Username" 

En mi plantilla .slim estoy usando el motor de café para generar javascript y quiera imprimir el nombre de usuario del código JavaScript en el cliente sie -

coffee: 
    $(document).ready -> 
    name = "#{@user_name}" 
    alert name 

Pero este es el javascript que se está generando ??

$(document).ready(function() { 
    var name; 
    name = "" + this.my_name; 
    alert(name); 
} 

¿Cómo puedo acceder a las variables de instancia de controlador en mi código CoffeeScript ??

Lo estoy etiquetando como haml ya que supongo que haml tendrá el mismo problema cuando use CoffeeScript.

+1

@Thilo No, él está tratando de inyectar la variable de Ruby '@ user_name'. Ruby y CoffeeScript usan la misma sintaxis de interpolación de cadenas. –

+1

Ya veo. Por cierto, ¿cómo es que el nombre de la variable cambia de '" # {@ user_name} " ' a 'this.my_name'? – Thilo

+0

Porque en coffeescript, @prop se compila en this.prop –

Respuesta

86

Lo que está sucediendo es que "#{@user_name}" se interpreta como CoffeeScript, no como código de Ruby que se evalúa y se inyecta en la fuente de CoffeeScript. Usted pregunta: "¿Cómo puedo inyectar una variable de Ruby en mi fuente de CoffeeScript?"

La respuesta corta es: No hagas esto. El equipo de Rails tomó la decisión intencional de no admitir CoffeeScript incorporado en las plantillas en 3.1, porque hay una sobrecarga de rendimiento significativa al tener que compilar CoffeeScript en cada solicitud (como lo haría si permitiera que cadenas arbitrarias se inyectaran en la fuente) .

Mi consejo es servir a sus variables de Ruby por separado como JavaScript puro, y después hacer referencia a las variables de su CoffeeScript, por ejemplo .:

javascript: 
    user_name = "#{@user_name}"; 
coffee: 
    $(document).ready -> 
    name = user_name 
    alert name 
+0

gracias por su respuesta, por lo que, básicamente, lo que ha sugerido está bien desde la perspectiva del rendimiento? – kapso

+2

Eso depende de si Slim vuelve a compilar el CoffeeScript en la plantilla en cada solicitud. Sinceramente, no estoy seguro. Probablemente deberías moverlo a un archivo externo de todos modos; luego, solo se compilará en JS una vez y los navegadores lo almacenarán en caché. –

30

que tienden a evitar javascript en línea a toda costa.

Una buena manera de almacenar variables en su HTML, para ser utilizado desde su javascript, es utilizar los atributos de datos HTML5. Esto es ideal para mantener su javascript discreto.

+0

Eso no sería útil si está utilizando un JavaScript MVC y desea evitar realizar múltiples solicitudes HTTP al servidor. http://backbonejs.org/#FAQ-bootstrap – jackyalcine

+0

Si está utilizando javascript MVC, generalmente realiza solicitudes ajax para obtener los datos, y renderiza el html en el cliente de todos modos. Pero, por ejemplo, los parámetros de configuración general aún se pueden enviar una vez en atributos de datos en html/body/container. – nathanvda

+0

cierto, cierto.Lo siento si salí muy precipitado! – jackyalcine

2

También es posible usar:

$(document).ready -> 
    name = <%= JSON.generate @user_name %> 
    alert name 

Esto se debe a JSON es un subconjunto de JavaScript.

+1

Esto es duro. O al menos lo hace dentro de los archivos Dashing .coffee. –

Cuestiones relacionadas