2009-11-20 4 views
0

Je suis nouveau sur les rails alors allez-y doucement. J'ai créé un blog et j'essaie d'ajouter une fonctionnalité de type "vote up" à la page /posts/index.html.erb. Un peu comme la fonction de Facebook. J'ai réussi à faire fonctionner le formulaire de vote. J'ai réussi à obtenir les messages rendus par le <% @ posts.each do | post | %> appel. Voici où j'ai le problème. Je dis alors index, dans le ci-dessus, pour rendre également pour chaque poste le formulaire de vote et aussi le <% = post.votes.count%> pour afficher le total des votes pour chaque publication et permettre de soumettre le formulaire pour chaque publication. J'utilise AJAX pour permettre à tout cela de fonctionner ensemble.Ruby on Rails - Problème AJAX - div

En raison du fonctionnement de mon /votes/create.js.rjs, j'envoie le résultat à div id = "votes", et dans le <% @ posts.each do | post | %> I wrap <% = post.votes.count%> dans la balise div de votes. Mais lorsque create.js.rjs envoie les données, il ne met à jour que la première balise div sur la page html rendue. Donc, si vous pouvez imaginer, comme sur Facebook, lorsque vous cliquez sur le fait que vous aimez quelque chose, la mise à jour ne se fait pas sur le post que vous venez de cliquer mais en haut de la page sur un autre article, le premier message. Le nombre de votes est représenté à partir de l'élément sur lequel vous avez cliqué, mais sur le mauvais enregistrement.

Voici le code:

POTEAUX/index.html.erb

<% @posts.each do |post| %> 
    <%= render :partial => post %> 
    <%= render :partial => @post %> 
<div id="beltcomments"> 
    <div id="beltcommenttext"> 
    <div id="votebutton"> 
    <% remote_form_for [ post, Vote.new] do |f| %> 
    <%= f.hidden_field :vote, :value => '1' %> 
    <%= submit_tag '', :class => 'voteup' %> 

    </div> 
    <div id="vote"><br/> 

    <%= post.votes.count %> People like the above BattleCry. <br/> 

    <%= link_to "Comments (#{post.comments.count})", post %> 
    </div> 

    </div> 
</div> 

<br/> 
<br/> 
<br/> 
<br/> 

<% end %> 
<% end %> 

<div id="commenttime"> 
Copyright 2009, My Life BattleCry, LLC. 
</div> 

/POSTS/CREATE.JS.RJS

page.replace_html :votes, :partial => @vote 
page[@vote].visual_effect :highlight 

/POSTS/_VOTE.HTML.ERB

<% div_for vote do %> 
    <%= @post.votes.count %> with your vote. Awesome!!! 
    <div id="commenttime"> 
    Thanks for your vote. <br/> 
    </div> 

<% end %> 

Répondre

1

Vérifiez le rendu html réel d'abord pour voir s'il y a des identifiants uniques pour chacun des éléments. Si ce n'est pas le cas (et qu'il y a plusieurs éléments avec le même identifiant), JS mettra à jour le premier élément de la liste par défaut. Vous aurez besoin d'identifier de façon unique l'élément que vous voulez mettre à jour. Vous pouvez toujours faire un simple

<% @posts.each_with_index do |post, i| %> 

puis marquer chaque élément avec

<%= f.hidden_field "vote-#{i}", :value => '1' %> 

puis passer i à vos RJS il sait quel domaine il met à jour le compte pour.

+0

C'est exactement ce qui se passe. Je pense que je pourrais conduire un peu plus d'aide à la navigation avec où mettre ce qui précède. Par exemple, est-ce que je remplace l'actuel <% @ posts.do chaque | %> avec le code ci-dessus, ou est-ce que je l'ajoute en dessous? De plus, dois-je changer le /votes/create.js.rjs pour représenter "vote - # {i}" et quelle est la syntaxe correcte pour cela.Enfin, dois-je ajouter quelque chose à votes_controller.rb pour le transmettre comme vous le dites? J'espérais qu'il y avait quelque chose qui faisait ça. Merci et laissez-moi savoir sur ce qui précède si vous le pouvez. – bgadoci

+0

Correct, vous remplacez l'actuel <% @ posts.do chaque | %>. Correct, vous devrez vérifier dans les rjs pour chercher quelque chose comme "vote - # {i} (mais voir le paragraphe suivant d'abord) Correct, vous auriez besoin de passer cela au contrôleur, de passer aux rjs Cela peut être réalisé en ajoutant: with => i à la forme_remote_for ou en créant un autre champ caché qui contient la valeur de i pour chaque div. Il sera ensuite envoyé avec le formulaire et vous pouvez simplement utiliser "vote - # { params [: i]} "pour obtenir la valeur – Lukas

0

Je ne comprends pas complètement la question. Vous dites que lorsque vous cliquez sur voter, il met à jour le compte sur le mauvais post?

En supposant que c'est le cas, je pense que votre problème est que vous n'êtes pas d'identifier de façon unique chaque poste dans votre code HTML. Côté note, ces divs etc doivent être des classes, ce n'est pas valide html. Quoi qu'il en soit, vous voulez que chaque post ait une div avec un identifiant unique, à savoir post_1, post_2 etc., et que cela soit envoyé avec votre requête ajax, donc la réponse sait quelle div mettre à jour.

Une astuce ici, non liée à votre question, est de mettre toute cette boucle dans un partiel et le rendre avec: collection. Fait pour le code beaucoup plus agréable.

+0

Merci pour le conseil.La réponse de Lukas semble que ça va marcher ... il me faut juste un peu plus de détails pour savoir où mettre tout ce que je veux. moi un peu pour comprendre les choses. – bgadoci