2011-01-16 18 views
45

Tengo la siguiente función para usar ZenDesk. Me gustaría insertar los datos de mi usuario actual en el formulario de la siguiente manera. (este es mi de la plantilla html.haml). Sin embargo, no puedo entender cómo hacer que esto funcione.Inyectando valores variables en javascript y HAML en RoR

:javascript 
    if (typeof(Zenbox) !== "undefined") { 
     Zenbox.init({ 
     dropboxID: "xxxxx", 
     url:   "xxxxx.zendesk.com", 
     tabID:  "support", 
     tabColor: "black", 
     tabPosition: "Left", 
     requester_name: =current_user ? "#{current_user.first_name} #{current_user.last_name}" : "" , 
     requester_email: =current_user ? "#{current_user.email}" : "" , 
     hide_tab: true 
     }); 
    } 

En resumen, ¿cómo se inyecta una variable de rieles en un elemento: javascript en haml.

+0

Las respuestas serán las mismas sin HAML: http://stackoverflow.com/questions/2464966/passing-ruby-variables-to-javascript-function-in-rails-view –

Respuesta

54

Esto debería funcionar, es decir. poner todo en línea de rubí en el interior de #{}:

requester_name: "#{current_user.first_name + ' ' + current_user.last_name if current_user}", 
requester_email: "#{current_user.email if current_user}", 
+0

¿Y qué tal la dirección inversa? es decir, : javascript # {raw some_helper (ARGUMENTOS DE JS AQUÍ)} – januszm

+0

Javascript se ejecuta en un navegador y ruby ​​en el servidor para que no pueda hacerlo así. – Heikki

20

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 &lt;.

- a = "\\n<" 
:javascript 
    '#{ j(a)   }' === '\\n&lt;' 
    '#{ 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' 
+2

Downvoters por favor explique para que pueda mejorar la información. Nunca tomo represalias Gracias. –

Cuestiones relacionadas