acts_as_votable thumbs up/down buttons

后端 未结 2 1792
慢半拍i
慢半拍i 2020-12-08 12:46

I installed the acts_as_votable gem, it works in the console like it should (like it says in the documentation). So my question is how to set up a form for upvote and downvo

相关标签:
2条回答
  • 2020-12-08 13:07

    Here's how I ended up doing it with the acts_as_commentable gem too. So I think this should work with any object that you have comments for.

    In my _comment.html.erb view

    <%= link_to "Upvote", {:controller =>"comments", :action => "upvote", :id => comment.id}, :class => 'btn', method: :put %>
    <%= link_to "Downvote", {:controller =>"comments", :action => "downvote", :id => comment.id}, :class => 'btn', method: :put %>
    

    in my routes.rb file

    put '/comments/:id/:action' => 'comments#upvote'
    put '/comments/:id/:action' => 'comments#downvote'
    

    Then in my comments controller

    class CommentsController < ApplicationController
      before_filter :load_commentable
      before_filter :find_comment, :only => [:upvote, :downvote]
    
    
    
      def upvote
        current_user.upvotes @comment
        redirect_to(@comment.commentable)
      end
    
      def downvote
        @comment.downvote_from current_user
        redirect_to(@comment.commentable)
      end
    
    
    
    
    private
    
      def load_commentable
        resource, id = request.path.split('/')[1, 2]
        @commentable = resource.singularize.classify.constantize.find(id)
      end
    
      def find_comment
        @comment = Comment.find(@commentable.id)
      end
    
    
    end
    

    The before filters allow for more versatility so I can add this to any commentable object. Mine happened to be festivals, but you could do pictures or anything really. Check out the acts_as_commentable documentation and the polymorphic railscast for more information on that. This is my first post so if this is terrible code, just tell me.

    0 讨论(0)
  • 2020-12-08 13:22

    One way to do this is to add your own controller actions for up- and downvotes. I'm assuming you have a current_user method available in your controller.

    # pictures_controller.rb
    def upvote
      @picture = Picture.find(params[:id])
      @picture.liked_by current_user
      redirect_to @picture
    end
    
    def downvote
      @picture = Picture.find(params[:id])
      @picture.downvote_from current_user
      redirect_to @picture
    end
    
    # config/routes.rb
    
    resources :pictures do
      member do
        put "like", to: "pictures#upvote"
        put "dislike", to: "pictures#downvote"
      end
    end
    
    # some view
    
    <%= link_to "Upvote", like_picture_path(@picture), method: :put %>
    <%= link_to "Downvote", dislike_picture_path(@picture), method: :put %>
    
    0 讨论(0)
提交回复
热议问题