Gem "acts_as_votable"

1. Giới thiệu:

Acts As Votable là một Ruby Gem được viết riêng cho các mô hình Rails / ActiveRecord nhằm phục vụ cho việc giải quyết các chức năng như like, dislike, vote up, vote down một cách nhanh chóng ...

2. Cài đặt:

Thêm vào Gemfile

gem 'acts_as_votable', '~> 0.10.0'

Sau đó bundle Tiếp đến, thực thi:

rails generate acts_as_votable:migration
rake db:migrate

3. Cách sử dụng

Ví dụ, mình muốn thêm chức năng like vào cho bài viết (Post.rb), được like bởi User (User.rb) thì sau khi cài đặt gem mình cần khai báo: Post.rb

class Post < ActiveRecord::Base
   acts_as_votable
end

User.rb

class User < ApplicationRecord
    acts_as_voter
end

4. Rails console:

  • ActsAsVotable::Vote.all
  • p.votes_for.up.by_type(User).voters //lấy ra danh sách User đã like bài viết

  • post.get_upvotes.size //đếm có bao nhiêu lượt thích

  • p.liked_by User.first // Thêm like

  • p.disliked_by User.second //Bỏ like

5. Demo:

rails new vote
cd vote/
rails g scaffold Post title:string content:text
rake db:migrate
rails g controller home index

Thêm vào gemfile:

gem "devise" gem "acts_as_votable"

rồi bundle

rails generate devise:install
rails generate devise User
rails generate acts_as_votable:migration

Khai báo post.rb, user.rb (như hướng dẫn mục 3), và routes:

Rails.application.routes.draw do
  root 'home#index'

  devise_for :users
  resources :posts
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  resources :posts do
    resources :votes, only: [:create, :destroy]
   end
end

home_controler.rb

class HomeController < ApplicationController
  def index
    if user_signed_in?
      redirect_to posts_path
    end
  end
end

Thêm votes_controller.rb

class VotesController < ApplicationController
  def create
    @post = Post.find_by id: params[:post_id]
    @post.liked_by current_user
    respond_to do |format|
      format.html{redirect_to @post}
      format.js{render :vote}
    end
  end

  def destroy
    @post = Post.find_by id: params[:post_id]
    @post.disliked_by current_user
    respond_to do |format|
      format.html{redirect_to @post}
      format.js{render :vote}
    end
  end
end

File _vote.form.html.erb

<div id="vote_form">
  <% if user_signed_in? %>
    <% if (current_user.voted_down_on? post) || (!ActsAsVotable::Vote.where(voter_id: current_user,votable_id: post.id).present?) %>
      <%= link_to post_votes_path(post), method: :post, remote: true do %>
        <span class="glyphicon glyphicon-heart-empty"></span>
      <% end %>
    <% else %>
      <%= link_to post_vote_path(post,0), method: :delete, remote: true do %>
        <span class="glyphicon glyphicon-heart"></span>
      <% end %>
    <% end %>
  <% end %>
  <%= t "posts.show.like" %> <%= post.get_upvotes.size %>
  <%= raw post.votes_for.up.by_type(User).voters.map { |voter| link_to voter.email, "#" }.join(', ') %>
</div>

vote.js.erb

 $("#vote_form").html("<%= j (render('posts/vote_form', post: @post)) %>");

show.html.erb thêm

<%= render "vote_form", post: @post %>

rồi rails s ta thu được kết quả sau:

6. Mã nguồn:

Demo Gem Acts As Votable - By ptnk1995

7. Tham khảo:

https://github.com/ryanto/acts_as_votable