【发布时间】:2020-04-12 19:19:47
【问题描述】:
我正在尝试将用户业力功能添加到我的应用程序中,我几乎完成了,只是业力被授予不同的用户。
注意,我喜欢的系统是从头开始的,而不是acts_as_votable。
我想要什么:
- 当用户为一本书点赞时,我希望将 +1 业力奖励给 book.user
- 如果用户的书籍被否决的次数多于他们的投赞成票数,我想要这样 用户有负面业力。
我得到了什么:
- 当一本书被点赞时,点赞该书的用户将获得 +1 业力而不是 book.user。
-
当业力为 0 的用户的书被否决时,业力会增加 1 而不是减少。
类 AddKarmaToUsers
我的代码:
投票.rb
class Vote < ApplicationRecord
belongs_to :user
belongs_to :book
validates_uniqueness_of :user_id, scope: :book_id
after_create :increment_vote, :add_karma
after_destroy :decrement_vote, :remove_karma
private
def increment_vote
field = self.upvote ? :upvotes : :downvotes
Book.find(self.book_id).increment(field).save
end
def decrement_vote
field = self.upvote ? :upvotes : :downvotes
Book.find(self.book_id).decrement(field).save
end
def add_karma
user = User.find(self.user_id)
user.increment(:karma, 1).save
end
def remove_karma
user = User.find(self.user_id)
user.decrement(:karma, 1).save
end
end
votes_controller.rb
class VotesController < ApplicationController
def create
book_id = params[:book_id]
vote = Vote.new
vote.book_id = params[:book_id]
vote.upvote = params[:upvote]
vote.user_id = current_user.id
#check if vote by this user exists
existing_vote = Vote.where(user_id: current_user.id, book_id: book_id)
@new_vote = existing_vote.size < 1
respond_to do |format|
format.js {
if existing_vote.size > 0
#destroy existing vote
existing_vote.first.destroy
else
#save new vote
if vote.save
@success = true
else
@success = false
end
# @total_upvotes = @book.upvotes
# @total_downvotes = @book.downvotes
end
@book = Book.find(book_id)
@is_upvote = params[:upvote]
render "votes/create"
}
end
end
private
def vote_params
params.require(:vote).permit(:upvote, :book_id)
end
end
【问题讨论】:
标签: ruby-on-rails ruby