Quelle est la meilleure façon de refactoriser UJS link_to_function?

J’ai l’interface suivante pour un de mes projets de passe – temps orienté base-brouillon qui permet au propriétaire d’une équipe de définir un ensemble de critères permettant de classer les joueurs:

classement_formule

Cliquez sur les atsortingbuts pour append cet atsortingbut à la liste, lui donner un facteur d’importance et un sens de sorting.

Dans Rails 2 et 3 (avec les helpers prototypes), je l’ai fait comme suit:

Où “add_ranking_atsortingbute_link (atsortingbutename)” est:

 def add_ranking_atsortingbute_link(atsortingbutename) link_to_function atsortingbutename do |page| page.insert_html :bottom, :rankingatsortingbutes, :partial => 'ranking_atsortingbute', :locals => {:atsortingbutename => atsortingbutename } end end 

Je convertis cela en jQuery, mais je ne suis pas sûr de la meilleure façon de le faire – principalement à cause de la boucle impliquée. Je peux le faire:

 
  • 'atsortingbuteappend', :onclick => "$('#rankingatsortingbutes').append('#{escape_javascript(render(:partial => 'ranking_atsortingbute',:locals => {:atsortingbutename => atsortingbutename}))}')") %>

Ce qui est fondamentalement juste remplacer la link_to_function. Mais y a-t-il une meilleure façon? La façon dont tu vas me faire voudrait que je fasse quelque chose comme:

 $(".atsortingbuteappend).click(function() { $('#rankingatsortingbutes').append('#{escape_javascript(render(:partial => 'ranking_atsortingbute',:locals => {:atsortingbutename => atsortingbutename}))}') }); 

Mais cela ne fonctionne pas en dehors de la boucle en raison de la manipulation d’atsortingbutame. Honnêtement, je suis un peu perdu dans le mélange de erb et javascript – et je ne connais pas un bon moyen de passer atsortingbutename en tant que paramètre de la fonction javascript à réinsérer dans le rendu partiel sans une cascade fragile d’erreurs de débogage erb et javascript, toutes les deux dont sont frustrant de déboguer.

Il doit y avoir un meilleur moyen cependant (et je suis sûr qu’il existe une meilleure interface pour cela, les suggestions sont les bienvenues!).

Je ferais ceci dans la vue:

 link_to 'atsortingbutename','#',:class => 'atsortingbuteappend' 

et puis le bit correspondant de js serait

 $(".atsortingbuteappend").click(function() { $('#rankingatsortingbutes').append($('#template').html().replace(/toReplace/g, $(this).text()); return false; }); 

Cela suppose que vous avez un élément invisible sur la page avec un template identifiant, quelque chose comme

 
Atsortingbute: toReplace ...

Lorsque vous cliquez sur le lien, le javascript est déclenché. Il récupère le code HTML à l’intérieur du modèle et remplace toutes les instances de toReplace par le texte extrait du lien et l’ajoute à l’élément avec les ranking atsortingbutes id.

Si vous souhaitez que le texte du lien soit différent de la valeur réelle ainsi remplacée, vous pouvez append des atsortingbuts de données à vos liens avec la valeur correcte.