template programming language ruby-on-rails ruby-on-rails-3 coffeescript haml slim-lang

ruby on rails - programming - Cómo acceder a las variables de instancia en el motor CoffeeScript dentro de una plantilla Slim



slim programming language (3)

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 las variables de Ruby por separado como JavaScript puro, y luego hacer referencia a esas variables desde CoffeeScript, por ejemplo:

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

Tengo un controlador de Rails en el que estoy configurando una variable de instancia -

@user_name = "Some Username"

En mi plantilla .slim, estoy utilizando un motor de café para generar javascript y quiero imprimir el nombre de usuario del código javascript de client-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 accedo a las variables de instancia del controlador en mi código CoffeeScript?

Estoy etiquetando esto como haml ya que supongo que haml tendrá el mismo problema cuando use CoffeeScript.


También puedes usar:

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

Esto se debe a que JSON es un subconjunto de JavaScript.


Tiendo a evitar el Javascript en línea a toda costa.

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