2011-01-16 5 views
45

Ich habe die folgende Funktion für die Verwendung von ZenDesk. Ich möchte meine current_user Details in das Formular wie folgt einfügen. (Dies ist meine Vorlage aus html.haml). Ich kann jedoch nicht herausfinden, wie das funktioniert.Injector Variablenwerte in Javascript und 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 
     }); 
    } 

Kurz gesagt, wie injiziert Rails-Variablen in ein: Javascript-Element in haml.

+0

Die Antworten werden die gleichen ohne HAML sein: http://StackOverflow.com/Questions/2464966/Passing-Ruby-Variables-To-Jascript-Funktion-in-Rails-view –

Antwort

54

Dies sollte funktionieren dh. setzt all Inline-Rubin innerhalb von #{}:

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

Und wie wäre es mit der umgekehrten Richtung? d. h. : javascript # {raw some_helper (ARGUMENTE VON JS HIER)} – januszm

+0

Javascript läuft in einem Browser und Ruby auf dem Server, so dass Sie es nicht so tun können. – Heikki

20

Direkte #{} Werke für einfache Strings, aber nicht die am besten skalierbare/sichere Lösung im Allgemeinen.

Zum Beispiel kann der Backslash in Ruby würden Sie Probleme in Javascript verursachen, wo es als Newline-Zeichen interpretiert werden:

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

Von this awesome Rails cast können die folgenden Techniken verwendet werden:

escape_javascript

Alias: j.

Funktioniert nur auf Strings.

Escapes Zeichen, die spezielle Bedeutungen in Javascript Zeichenfolgen haben können, wie Backslash Escapes, in ein Format geeignet, um innerhalb Javascript Zeichenfolge Literal Zitate setzen.

Pflegen html_safe Status des Eingangs, muss so html_safe sonst spezielle HTML-Zeichen wie < würde in &lt; entkommen lassen.

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

to_json + html_safe

Works weil JSON almost a subset of Javascript object literal notation ist.

Funktioniert auf jedem Hash-Objekt, einschließlich Strings, Arrays und Ganzzahlen, die in JSON-Fragmente des entsprechenden Datentyps konvertiert werden.

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

Daten- Attribute

Werte Attribute hinzufügen, abrufen sie mit Javascript DOM-Operationen.

besser mit dem content_tag Helfer:

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

gon

Bibliothek für den Job spezialisiert: https://github.com/gazay/gon

Wahrscheinlich ist die robusteste Lösung.

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 %> 

Ausblick:

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

Downvoters bitte erklären, damit ich Informationen verbessern kann. Ich räche mich nie. Vielen Dank. –