web-dev-qa-db-fra.com

Comment accéder aux variables d'instance dans le moteur CoffeeScript dans un modèle Slim

J'ai un Rails contrôleur dans lequel je place une variable d'instance -

@user_name = "Some Username"

Dans mon modèle .slim, j'utilise le moteur de café pour générer du javascript et je souhaite imprimer le nom d'utilisateur à partir du code javascript du client -

coffee:
  $(document).ready ->
    name = "#{@user_name}"
    alert name

Mais c'est le javascript qui est généré ??

$(document).ready(function() {
    var name;
    name = "" + this.my_name;
    alert(name);
}

Comment accéder aux variables d'instance de contrôleur dans mon code CoffeeScript ??

Je marque cela en tant que haml car je suppose que haml aura le même problème lors de l'utilisation de CoffeeScript.

50
kapso

Ce qui se passe, c'est que "#{@user_name}" est interprété comme CoffeeScript, pas comme Ruby code évalué et injecté dans la source CoffeeScript. Vous demandez: "Comment injecter un Ruby = variable dans ma source CoffeeScript? "

La réponse courte est: ne faites pas ça. L'équipe Rails a délibérément pris la décision de ne pas prendre en charge CoffeeScript intégré dans les modèles en 3.1, car il y a un surdébit de performances important à devoir compiler CoffeeScript à chaque demande (comme vous devriez le faire si vous le permettez). chaînes arbitraires à injecter dans la source).

Mon conseil est de servir séparément vos variables Ruby en JavaScript pur, puis de référencer ces variables depuis votre CoffeeScript, par exemple:

javascript:
  user_name = "#{@user_name}";
coffee:
  $(document).ready ->
    name = user_name
    alert name
92
Trevor Burnham

J'ai tendance à éviter le javascript en ligne à tout prix.

Une bonne façon de stocker des variables dans votre HTML, à utiliser depuis votre javascript, est d'utiliser les attributs de données HTML5. C'est idéal pour garder votre javascript discret.

32
nathanvda

Vous pouvez également utiliser:

$(document).ready ->
  name = <%= JSON.generate @user_name %>
  alert name

C'est parce que JSON est un sous-ensemble de JavaScript.

2
gene tsai