2010-09-21 6 views
0

Je travaille sur une application web Ruby on Rails, dans laquelle j'ai plusieurs listes de messages. Chaque poste utilisera Ajax pour charger leurs commentaires. Afin de les remplir au bon endroit, je suis en train de faire ce qui suit:Ajax on Rails - J'ai un problème

Chaque message a une div avec un ID formaté comme suit: <div id="my_div_<%= post.id %>"></div>. Ainsi, par exemple si le post.id est 12, l'identifiant sera "my_div_12".

action de mon contrôleur ressemble à ceci:

render :update do |page| 
    page.replace_html 'my_div_' + params[:post_id].to_s, :partial => 'my_comments_section_partial_path' 
end 

Cela fonctionne bien que si je poste une seule fois sur la page. Mais dans ce site, chaque post peut être listé plus d'une fois, car il existe plusieurs listes (derniers posts, populaires, tops, etc). Et tous auront leur section Commentaires à montrer. Le problème est maintenant que, comme la fonctionnalité de la section commentaires est à l'intérieur d'une vue partielle, elle fonctionnera de la même manière pour chaque type de liste (comme prévu), et par conséquent, elle ne fait pas la différence entre les divs (parce qu'ils auront le même post.id, et donc, id de la même div).

Ma question est maintenant: comment pourrais-je résoudre ce problème? Y a-t-il une meilleure façon de faire cela?

Merci d'avance!

EDIT:

Juste pour préciser ce que je veux, en quelques mots:

Je voudrais le code page.replace_html 'my_div_' + params[:post_id].to_s, :partial => 'my_comments_section_partial_path' pour remplacer cette partie dans CHAQUE div appelé 'my_div' + params[:post_id].to_s(car il peut y avoir plus d'un div dans la même page avec le même id).

+0

À quoi ressemble votre contrôleur? Vous dites que tous les div ont le même ID? – Trip

+0

Quel est le problème que vous essayez de résoudre? Un message donné aura toujours des commentaires identiques à ce même message affiché dans un autre widget (ou ailleurs). – Eric

+0

J'ai dans plus d'un endroit de la même page, le même poste. Maintenant, chaque article a une section "comments" qui est affichée (et chargée) quand un bouton "Show comments" est cliqué. Dans l'action du contrôleur que j'ai posté ci-dessus, je remplace le commentaire div pour un partiel avec les commentaires du post. Donc, cela sera remplacé seulement dans un div (et j'ai un de ces divs avec le même id, par chaque poste avec le même id. Par exemple: je montre le poste # 2 dans la page deux fois, alors j'en aurai deux divs avec l'id = "div_post_2"). Donc, je voudrais remplacer les résultats de ces commentaires dans chaque div avec le même id. –

Répondre

1

Notez que le fait d'avoir plusieurs éléments avec le même ID sur une page produit un code HTML techniquement invalide. De nombreux navigateurs ne rendront même pas tous ces attributs d'identification (en laissant un et en effaçant le reste).

Une solution simple consiste à utiliser des classes plutôt que des identifiants. Il peut y avoir plusieurs éléments avec la même classe et chaque élément peut avoir plusieurs classes.
Je ne travaille pas avec les aides ajax intégrées dans Rails, mais google suggère it's possible.

+0

Ce lien a travaillé pour moi !! Je vous remercie. –

0

Il semble que vous ayez deux séries de publications sur la même page et que vous ayez peur de placer les commentaires pour le bon article au bon endroit. Je pense que faire deux requêtes Ajax serait bien. Les URL seraient probablement quelque chose comme /posts/1/comments et /posts/2/comments. Essentiellement ce que vous voulez est "tous les commentaires pour un poste donné". Vous pourriez avoir une action de commentaires sur votre contrôleur de posts pour utiliser votre association has_many :comments de Post. À l'aide du paramètre URL ID, vous pouvez fournir l'ID poste. Vous pouvez obtenir l'ID poste hors du balisage via un attribut ID personnalisé, une classe personnalisée ou un custom data-* attribute. Il semble que vous utilisiez RJS mais je recommanderais d'utiliser Prototype ou jQuery pour faire la requête Ajax et spécifier les données JSON ou HTML comme réponse, puis ajouter le JSON ou HTMl au bon endroit.

En jQuery, je récupère l'ID poste, fais la requête ajax, puis ajoute le commentaire HTML. Ce n'est pas testé, mais à peu près l'idée dans le code.

var comments_div = $('.post .comments'); /* need a diff. comments div for each */ 
var post_id = $('.post').attr('data-post_id'); 
$.get({'/posts/'+post_id+'/comments', function(data){ comments_div.append(data); } });