Metodi di Ruby all’interno di Javascript in HAML

Ho uno script jQuery che aggiunge un nuovo campo a un modulo e questo campo contiene informazioni dinamiche da un array. Il problema è che non riesco a capire come aggiungere un array.each per popolare le opzioni del campo di selezione all’interno del javascript senza interrompere il rientro HAML e causare errori.

Ecco il mio miglior tentativo che non funziona:

%script(type="text/javascript") $('#mylink').click(function() { $('#mylink').after(' - myarray.each do |options| #{options.name} ); )}; 

Anche provato con il: filtro javascript senza fortuna.

Di solito, se qualcosa è un dolore in haml, significa che devi rifattorizzare il bit difficile a un aiutante o parziale e chiamarlo.

 // some_helper.rb def new_snazzy_select_tag(options = []) select_tag 'tag_name_here', options.map { |option| [option.id, option.name] } end 

Inoltre, dovresti usare il :javascript filtro :javascript per il rendering di javascript poiché lo inserirà in un tag di script e consentirà il rientro.

Infine, puoi usare #{ruby_expression} ovunque in haml, tra cui :javascript filtri :javascript , che è molto utile quando devi generare il risultato di espressioni ruby ​​in posizioni che non sono direttamente contenuti di elementi html.

 // some_view.html.haml :javascript $('#mylink').click(function() { $('#mylink').after("#{escape_javascript new_snazzy_select_tag(myarray)}"); }; 

Prova questo, dovrebbe funzionare (tutto ciò che ho fatto è stato rimuovere un singolo spazio nella quinta riga e aggiungere la citazione di chiusura al sesto):

 %script(type="text/javascript") $('#mylink').click(function() { $('#mylink').after(''); )}; 

Tuttavia, supponendo che tu stia eseguendo questo con uno script ruby o un framework di sorta, perché non farlo semplicemente fuori dal modello? Probabilmente sarebbe più appropriato. In rails / sinatra e altri framework, è ansible utilizzare un metodo di supporto per farlo. Se si guarda al riferimento di haml, in realtà scoraggiano l’uso di - per valutare il ruby.