Ruby on rails 如何为合适的用户设置业力
我正在尝试向我的应用程序添加一个用户业力功能,我几乎完成了,只是业力被授予了另一个用户 注意,我喜欢的系统是从零开始的,不起作用 我想要的是:Ruby on rails 如何为合适的用户设置业力,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在尝试向我的应用程序添加一个用户业力功能,我几乎完成了,只是业力被授予了另一个用户 注意,我喜欢的系统是从零开始的,不起作用 我想要的是: 当一个用户对一本书进行投票时,我想要一个+1业力奖励给该用户 图书用户 如果一个用户的书被否决的次数多于被否决的次数,我希望这样 用户有负面的业力 我得到的是: 当一本书被升级时,升级该书的用户将获得+1 因果报应,而不是书本用户 当业力为0的用户的书籍被否决时,业力将增加1,而不是减少 类AddKarmaToUsers
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
class投票
投票控制器.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
class VotesController0
#破坏现有投票权
现有的
其他的
#保存新选票
如果投票,请保存
@成功=正确
其他的
@成功=错误
终止
#@total_upvoces=@book.upvoces
#@total_downvows=@book.downvows
终止
@book=book.find(book\u id)
@is_upvote=params[:upvote]
呈现“投票/创建”
}
终止
终止
私有的
def vote_params
参数require(:vote).permit(:upvote,:book_id)
终止
终止
首先,当使用活动记录关系时,您不需要调用模型。在类中找到
,只需使用其名称调用关系:
def增量表决
字段=self.upvote?:赞成票:反对票
book.increment(字段).save
终止
加上因果报应
user.increment(:karma,1)。保存
终止
在add_karma
和remove_karma
中,您引用的是投票所属的用户,而不是书籍所有者。为了实现你的目标,你还应该增加和减少书主人的业力:
def添加业力
user.increment(:karma,1)。保存
book.user.increment(:karma,self.upvote?1:-1)。保存
终止
解除因果报应
user.increment(:karma,1)。保存
书。使用者。减量(:业力,1)。保存
终止
您可以重写控制器以简化代码:
class VotesController
啊,谢谢,我能够将业力分配给book.user,但如果向下投票数大于向上投票数,用户仍然不会得到负面业力。相反,会分配积极的业力。例如,我数据库中的一个用户没有记录任何向上投票,而业力仍然为零(0),如果另一个用户对拥有零业力记录的用户进行向下投票,业力变为1,而不是-1。但是当减少现有的积极业力时,它可以正常工作。@TolaseAdegbite你的activerecord有回调功能吗?确保这些回调函数不返回负数或false,尤其是-1。我记得在生产代码中有一个奇怪的bug,每当在回调中执行一个返回负数的函数时,它都会被回滚,就好像永远不会发生一样all@TolaseAdegbite请参阅答案中更新的add_karma
方法。