web-dev-qa-db-fra.com

Ruby méthodes dans Javascript dans HAML

J'ai un script jQuery qui ajoute un nouveau champ à un formulaire, et ce champ contient des informations dynamiques à partir d'un tableau. Le problème est que je ne peux pas comprendre comment ajouter un tableau.each pour remplir les options du champ de sélection dans le javascript sans casser l'indentation HAML et provoquer des erreurs.

Voici ma meilleure tentative qui ne fonctionne pas:

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

A également essayé avec le filtre: javascript sans succès.

57
Josh

Habituellement, si quelque chose est une douleur dans le haml, cela signifie que vous devez refactoriser le bit délicat à un assistant ou partiel et appeler cela.

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

Vous devez également utiliser le :javascript filtre pour rendre javascript car il le mettra dans une balise de script pour vous et permettra l'indentation.

Enfin, vous pouvez utiliser #{Ruby_expression} n'importe où dans le haml, y compris :javascript filtres, ce qui est très pratique lorsque vous devez afficher le résultat d'expressions Ruby) à des endroits qui ne sont pas directement le contenu des éléments html.

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

Essayez ceci, cela devrait fonctionner (tout ce que j'ai fait a été de supprimer un seul espace dans la cinquième ligne et d'ajouter la citation de clôture sur la sixième):

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

Cependant, en supposant que vous exécutez cela avec un script Ruby ou un cadre de toutes sortes, pourquoi ne pas le faire en dehors du modèle? Ce serait probablement le plus approprié. Dans Rails/sinatra et d'autres cadres, vous pouvez utiliser une méthode d'assistance pour ce faire. Si vous regardez la référence haml, ils découragent en fait l'utilisation de - pour évaluer Ruby.

8
ehsanul