54 votes

L'injection de valeurs d'une variable en javascript et HAML dans RoR

J'ai la fonction suivante pour utiliser ZenDesk. Je voudrais injecter mon current_user détails dans le formulaire de la façon suivante. (c'est mon html.haml modèle). Cependant je ne peux pas comprendre comment faire ce travail.

: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 bref, comment fait-on injecter des rails de variables dans un :élément javascript dans haml.

66voto

Heikki Points 7416

Cela devrait fonctionner ie. mis en ligne le rubis à l'intérieur de l' #{}:

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

29voto

Ciro Santilli Points 3341

Direct, #{} travaille pour de simples chaînes de caractères, mais n'est pas la plus évolutive / solution de sécurité en général.

Par exemple, le backslash en Ruby pourraient vous causer des problèmes en Javascript où il sera interprété comme un caractère de saut de ligne:

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

À partir de ce génial Rails en fonte, les techniques suivantes peuvent être utilisées:

escape_javascript

Alias: j.

Fonctionne uniquement sur les cordes.

S'échappe les caractères qui peuvent avoir une signification spéciale dans les chaînes de caractères Javascript, comme des antislashes, dans un format adapté à mettre à l'intérieur de Javascript littéral de chaîne entre guillemets.

Conserver html_safe statut de l'entrée, donc, les besoins en html_safe sinon caractères spéciaux HTML comme < permettrait d'obtenir échappé en &lt;.

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

to_json + html_safe

Fonctionne parce que JSON est presque un sous-ensemble de Javascript object notation littérale.

Fonctionne sur n'importe quel objet de hachage, y compris les chaînes, les tableaux et les entiers qui ne sont converti en JSON fragments du type de données correspondant.

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

attributs data-

Ajouter des valeurs pour les attributs, les récupérer avec Javascript DOM opérations.

Mieux avec l' content_tag helper:

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

gon

Bibliothèque spécialisée pour l'emploi: https://github.com/gazay/gon

Probablement l'un des plus solides de la solution.

Gemfile:

gem 'gon'

Contrôleur:

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

Mise en page app/views/layouts/application.html.erb:

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

Vue:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X