directos #{}
obras para cuerdas simples, pero no es la solución más escalable/seguro en general.
Por ejemplo, la barra invertida en Ruby que causaría problemas en Javascript donde será interpretado como un carácter de nueva línea:
- a = "\\n"
:javascript
'#{ a }' !== "\\n"
De this awesome Rails cast, las siguientes técnicas pueden ser utilizadas:
escape_javascript
Alias: j
.
Funciona únicamente en cadenas.
Escapa de 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.
Mantener html_safe
estado de la entrada, por lo que necesita html_safe
caracteres HTML especiales, como por lo demás <
conseguirían escapado a <
.
- a = "\\n<"
:javascript
'#{ j(a) }' === '\\n<'
'#{ j(a).html_safe }' === '\\n<'
a_json + html_safe
funciona porque JSON es almost a subset of Javascript object literal notation.
Funciona en cualquier objeto hash, incluidas cadenas, matrices y enteros que son convertidos a fragmentos JSON del tipo de datos correspondiente.
- data = { key1: 'val1', key2: 'val2' }
:javascript
data = #{ data.to_json }
data.key1 === 'val1'
data.key2 === 'val2'
Data- atributos
añadir valores a los atributos, recuperarlos con operaciones Javascript DOM.
mejor con el ayudante content_tag
:
= content_tag 'div', '', id: 'data', data: {key1: 'val1', key2: 'val2'}
:javascript
$('#data').data('key1') === 'val1'
$('#data').data('key2') === 'val2'
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'
Disposición app/views/layouts/application.html.erb
:
<html>
<head>
<meta charset="utf-8"/>
<%= include_gon %>
Vista:
:javascript
gon.key1 === 'val1'
gon.key2 === 'val2'
Las respuestas serán las mismas sin HAML: http://stackoverflow.com/questions/2464966/passing-ruby-variables-to-javascript-function-in-rails-view –