我目前正在使用thumbs_up gem来允许我的用户对帖子进行投票,并且我遇到了与vote_exclusively_for / against方法有关的问题。这是gem的github链接:https://github.com/brady8/thumbs_up。使用vote_up和vote_down方法可以很好地处理gem,但是当我将其更改为vote_exclusively_for(它应该替换之前的向下投票和/或投票)时,我的开发日志中出现以下错误:
ActiveRecord::RecordInvalid (Validation failed: Voteable has already been taken):
app/controllers/posts_controller.rb:97:in `vote_up'
在启动新投票之前,gem中的方法似乎没有清除之前的投票。这是我在posts_controller中的代码:
def vote_up
@user = current_user
@post = Post.find(params[:id])
@user.vote_exclusively_for(@post)
redirect_to (..)
end
以下是gem的代码:
def vote_exclusively_for(voteable)
self.vote(voteable, { :direction => :up, :exclusive => true })
end
def vote(voteable, options = {})
raise ArgumentError, "you must specify :up or :down in order to vote" unless options[:direction] && [:up, :down].include?(options[:direction].to_sym)
if options[:exclusive]
self.clear_votes(voteable)
end
direction = (options[:direction].to_sym == :up)
Vote.create!(:vote => direction, :voteable => voteable, :voter => self)
end
def clear_votes(voteable)
Vote.where(
:voter_id => self.id,
:voter_type => self.class.name,
:voteable_id => voteable.id,
:voteable_type => voteable.class.name
).map(&:destroy)
end
我不确定为什么clear_votes方法没有删除先前的投票。任何帮助将不胜感激。
答案 0 :(得分:1)
尝试在控制台中运行它,看看它是否有效:
user = ... # fetch the right user
post = ... # fetch the right post
Vote.where(
:voter_id => user.id,
:voter_type => User,
:voteable_id => post.id,
:voteable_type => Post
).map(&:destroy)
您还可以暂时修改clear_votes
并在那里进行一些日志记录,以确保self.class.name
和voteable.class.name
指的是正确的类。同时在映射之前使用where
将count
方法调用记录到destroy命令,以确保它不返回空数组。