Come accedere alle variabili di istanza nel motore CoffeeScript all’interno di un modello Slim

Ho un controller Rails in cui sto impostando una variabile di istanza –

@user_name = "Some Username" 

Nel mio template .slim sto usando coffee engine per generare javascript e voglio stampare il nome utente dal codice javascript di client-sie –

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

Ma questo è il javascript che viene generato ??

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

Come posso accedere alle variabili di istanza del controller nel mio codice CoffeeScript ??

Sto taggando questo come haml dal momento che sto pensando che haml avrà lo stesso problema quando si utilizza CoffeeScript.

Quello che sta succedendo è che "#{@user_name}" viene interpretato come CoffeeScript, non come codice Ruby che viene valutato e iniettato nel sorgente CoffeeScript. Stai chiedendo, “Come faccio a iniettare una variabile Ruby nel mio sorgente CoffeeScript?”

La risposta breve è: non farlo. Il team di Rails ha preso una decisione intenzionale di non supportare CoffeeScript incorporato nei modelli in 3.1, perché c’è un sovraccarico significativo delle prestazioni per dover compilare CoffeeScript su ogni richiesta (come avresti dovuto fare se hai permesso l’inserimento di stringhe arbitrarie nella sorgente) .

Il mio consiglio è di servire le tue variabili Ruby separatamente come puro JavaScript, e quindi fare riferimento a quelle variabili dal tuo CoffeeScript, ad esempio:

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

Tendo ad evitare javascript in linea a tutti i costi.

Un buon modo per memorizzare variabili nel tuo codice HTML, da utilizzare dal tuo javascript, consiste nell’utilizzare gli attributi dei dati HTML5. Questo è l’ideale per mantenere il tuo javascript discreto.

Puoi anche usare:

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

Questo perché JSON è un sottoinsieme di JavaScript.