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

J’ai un contrôleur Rails dans lequel je mets une variable d’instance –

@user_name = "Some Username" 

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

 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 taggue ceci comme haml car je suppose que haml aura le même problème en utilisant CoffeeScript.

    Ce qui se passe, c’est que "#{@user_name}" est interprété comme CoffeeScript, et non comme un code Ruby évalué et injecté dans la source CoffeeScript. Vous demandez, “Comment puis-je injecter une variable Ruby dans ma source CoffeeScript?”

    La réponse courte est: ne le faites pas. 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 3.1, car la compilation de CoffeeScript à chaque requête nécessite des performances importantes (comme si vous aviez autorisé l’injection de chaînes arbitraires dans la source) .

    Mon conseil est de servir vos variables Ruby séparément en tant que pur JavaScript, 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 

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

    Un bon moyen de stocker des variables dans votre code HTML, à utiliser depuis votre javascript, consiste à utiliser les atsortingbuts de données HTML5. Ceci est idéal pour garder votre javascript discret.

    Vous pouvez également utiliser:

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

    Cela est dû au fait que JSON est un sous-ensemble de JavaScript.