Gem "acts_as_votable"
Bài đăng này đã không được cập nhật trong 3 năm
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:
All rights reserved