2011-01-16 14 views
45

Ho la seguente funzione per l'utilizzo di ZenDesk. Mi piacerebbe inserire i dettagli di current_user nel modulo come segue. (questo è il mio modello html.haml). Tuttavia non riesco a capire come farlo funzionare.Iniezione di valori variabili in javascript e HAML in 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 
     }); 
    } 

In breve, come si iniettano le variabili delle rotaie in un: elemento javascript in haml.

+0

Le risposte saranno le stesse senza HAML: http://stackoverflow.com/questions/2464966/passing-ruby-variables-to-javascript-function-in-rails-view –

risposta

54

Questo dovrebbe funzionare vale a dire. mettere tutto in linea rubino all'interno di #{}: opere

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

E la direzione inversa? Ad esempio : javascript # {raw some_helper (ARGOMENTI DA JS HERE)} – januszm

+0

Javascript viene eseguito in un browser e ruba sul server, quindi non è possibile farlo in quel modo. – Heikki

20

diretti #{} per semplici stringhe, ma non è il/soluzione sicura più scalabile in generale.

Ad esempio, la barra rovesciata letterale in Ruby potrebbe causare problemi in Javascript, dove sarà interpretato come un carattere nuova riga:

- a = "\\n" 
:javascript 
    '#{ a }' !== "\\n" 

Da this awesome Rails cast, le seguenti tecniche possono essere utilizzate:

escape_javascript

Alias: j.

Funziona solo su stringhe.

Escapes caratteri che possono avere significati speciali nelle stringhe di Javascript, come escape backslash, in un formato adatto per inserire citazioni letterali stringa JavaScript.

Mantenere html_safe stato dell'ingresso, quindi ha bisogno html_safe altrimenti speciali caratteri HTML come < otterrebbero defluito in &lt;.

- a = "\\n<" 
:javascript 
    '#{ j(a)   }' === '\\n&lt;' 
    '#{ j(a).html_safe }' === '\\n<' 

to_json + html_safe

funziona perché JSON è almost a subset of Javascript object literal notation.

Funziona su qualsiasi oggetto di hash, incluse stringhe, matrici e numeri interi che sono convertiti in frammenti JSON del tipo di dati corrispondente.

- data = { key1: 'val1', key2: 'val2' } 
:javascript 
    data = #{ data.to_json } 
    data.key1 === 'val1' 
    data.key2 === 'val2' 

dati- attributi

aggiungere valori agli attributi, recuperarle con le operazioni Javascript DOM.

meglio con l'aiuto content_tag:

= content_tag 'div', '', id: 'data', data: {key1: 'val1', key2: 'val2'} 
:javascript 
    $('#data').data('key1') === 'val1' 
    $('#data').data('key2') === 'val2' 

gon

biblioteca specializzata per il lavoro: https://github.com/gazay/gon

Probabilmente la soluzione più robusta.

Gemfile:

gem 'gon' 

Controller:

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

layout app/views/layouts/application.html.erb:

<html> 
<head> 
    <meta charset="utf-8"/> 
    <%= include_gon %> 

Vista:

:javascript 
    gon.key1 === 'val1' 
    gon.key2 === 'val2' 
+2

I downvoters si spiegano per migliorare le informazioni. Non ho mai reagito. Grazie. –