¿Cómo pasar las variables de Ruby a una función de JavaScript en una vista de Rails?

Me pregunto cuál es la mejor práctica para pasar variables a funciones de JavaScript en una vista de Rails. En este momento estoy haciendo algo como:

  Event.observe(window, 'load', function(){ js_function(, ); )}   

¿Es esta la manera correcta de hacerlo?

Algunas opciones:

escape_javascript

Alias: j .

Funciona solo en cadenas.

Escapa de los caracteres que pueden tener un significado especial en cadenas de Javascript, como escapes de barra invertida, en un formato adecuado para poner dentro de cadenas de texto Javascript las comillas.

Mantiene el estado de entrada de html_safe , por lo que necesita html_safe contrario, los caracteres HTML especiales como < se escaparían a < .

 < % a = "\\n<" %> < %= javascript_tag do %> '< %= j(a) %>' === '\\n<' '< %= j(a).html_safe %>' === '\\n< ' <% end %> 

to_json + html_safe

Como lo menciona Vyacheslav, váyase a él.

Funciona porque JSON es casi un subconjunto de la notación literal de objetos Javascript .

Funciona no solo en objetos hash, sino también en cadenas, matrices y enteros que se convierten en fragmentos JSON del tipo de datos correspondiente.

 < % data = { key1: 'val1', key2: 'val2' } %> < %= javascript_tag do %> var data = < %= data.to_json.html_safe %> data.key1 === 'val1' data.key2 === 'val2' < % end %> 

datos-atributos

Agregue valores a los atributos, recupérelos con operaciones Javascript DOM.

Mejor con la ayuda content_tag :

 < %= content_tag 'div', '', id: 'data', data: {key1: 'val1', key2: 'val2'} %> < %= javascript_tag do %> $('#data').data('key1') === 'val1' $('#data').data('key2') === 'val2' < % end %> 

A veces llamado "Javascript discreto".

gon

Biblioteca especializada para el trabajo: https://github.com/gazay/gon

Probablemente la solución más robusta.

Gemfile:

 gem 'gon' 

Controlador:

 gon.key1 = 'val1' gon.key2 = 'val2' 

app/views/layouts/application.html.erb diseño app/views/layouts/application.html.erb :

    < %= include_gon %> 

Ver:

 < %= javascript_tag do %> gon.key1 === 'val1' gon.key2 === 'val2' < % end %> 

Ver también

  • Inyectar valores variables en javascript y HAML en RoR
 - content_for :javascripts_vars do = "var costs_data = #{@records[:cost_mode][:data].to_json}".html_safe = "var graph_data = #{@records[:cost_mode][:graph].to_json}".html_safe 

Hay una técnica llamada “JavaScript no intrusivo”. Aquí hay un Railscast: texto de enlace . Funciona tanto con el prototipo jQuery. También hay complementos que pueden ayudar a simplificar algunas de las tareas descritas en el artículo.

Encontré esa variable de cliente de gem, te ayuda a hacerlo fácilmente.

En HAML pueden los datos se presentan así:

 .position{data: {latitude: @claim.latitude.to_json, longitude: @claim.longitude.to_json}} :javascript var latitude = $('.position').data('latitude'); var longitude = $('.position').data('longitude');