Eddie Campain
Eddie Campain

Reputation: 45

Upvote button that can be unupvoted in Rails 4

I am creating a Rails 4 app in which a user can upvote a given post through the acts_as_votable gem. Let's say as a user I press the upvote button, how would I make it so that if I press the SAME button again, the vote gets taken away, so in essence an "unupvote"?

Here is what my upvote method looks like in my posts controller:

def upvote
  @post = Post.find(params[:id])
  @post.upvote_by current_user
  redirect_to :back
end

My post model

class Post < ActiveRecord::Base
  acts_as_votable
  belongs_to :user
end

And finally this how I am rendering the button in my views

<div class="btn-group">
  <%= link_to like_post_path(post), method: :put, class: "btn btn-default btn-sm" do %>
    <span class="glyphicon glyphicon-chevron-up"></span>
    Upvote
    <%= post.get_upvotes.size %>
  <% end %>
</div>

Thanks for the help guys!

Upvotes: 1

Views: 404

Answers (1)

Undo
Undo

Reputation: 25687

acts_as_votable has an unvote_up method you can use. I'd do something like this (assuming your like_post_path references the upvote action):

def upvote
  @post = Post.find(params[:id])

  if current_user.up_votes @post 
    @post.unvote_up current_user
  else
    @post.upvote_by current_user
  end

  @post.create_activity :upvote, owner: current_user
  redirect_to :back
end

You'll also need to add acts_as_voter to your User model so you can get the up_votes helper:

class User < ActiveRecord::Base
  acts_as_voter
end

Upvotes: 1

Related Questions