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 đó ...
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