views:

307

answers:

3

I am new to rails so sorry if sometimes I don't make much sense. Here is what I am trying to do. I am trying to build a vote system. So next to a blog post there is a link that says 'vote' (will probably say like later). So far I have working: when the vote button is clicked, a value of '1' is delivered to the vote table and then that particular posts vote records display beneath the vote via AJAX (I copied a comment functionality). Instead of rendering all the number '1's below, I want it to render the updated count.

My vote table has the columns 'vote' and 'post_id' that are successfully being entered. My thinking was that I could just change my partial template to do this. Here is the code:

votes_controller:

class VotesController < ApplicationController

  def create
    @post = Post.find(params[:post_id])
    @vote = @post.votes.create!(params[:vote])

    respond_to do |format|
       format.html { redirect_to @post}
       format.js
     end
  end
end

  def count
    @post = Post.find(params[:post_id])
    @vote = calculate :count

      respond_to do |format|
         format.html { redirect_to @post}
         format.js
    end
  end
end

Here is the page where is is showing, /posts/show.html.erb:

<div id="backto"<%= link_to 'Back to all BattleCries', posts_path %></div>
<%= render :partial => @post %><br/>


<p5>Add a Comment</p5>
<div id="belt">
    <div id="belttext">
<% remote_form_for [@post, Comment.new] do |f| %>
    <p>
     <%= f.text_area ( :body, :class => "commentarea") %>
    </p>
    <%= f.submit "Add Comment"%>
<% end %>
</div>
<div id="beltbottom">
</div>
</div><br/>
<br/><p5>Comment Stream </p5> 
<div id="comments">
    <%= render :partial => @post.comments %>

</div>

<p>
<% remote_form_for [@post, Vote.new] do |f| %>
    <p>

     <%= f.hidden_field :vote, :value => '1' %>
    </p>
    <%= f.submit "Vote" %>
<% end %>
<div id="vote">
<div id="votes">
    <%= render :partial => @post.votes %>
</div>
</div>
</p>

Here is the :partial, /votes/_vote.html.erb: (this is where I thought I would just need to change it to vote.count, or post.count or something but can't get it to work).

<% div_for vote do %>

     <%= h(vote.vote) %> 
    <% end %>

Here is the /votes/create.js.rjs file:

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

I hope that all makes sense.

A: 

You probably want:

<%= @post.votes.count %>
tadman
it does but repeats it. 333
bgadoci
A: 

You also probably want to use replace instead of insert_html - does that make sense? Insert is just adding more elements to the DOM whereas replace will replace the element.

Andy Gaskell
+1  A: 

I think it's repeating because your .rjs is "inserting at the bottom" of the div instead of "replacing" ... you probably want page.replace_html

It would be better to have a DIV or SPAN tag that contains the number of votes for a post ... then have your .rjs file update the DIV's inner_html with the number of votes (which would be @post.votes.count) ... I don't think you really need a partial.

Callmeed