В настоящее время я использую гем thumbs_up, чтобы мои пользователи могли голосовать за сообщения, и у меня возникла проблема с методами voice_exclusively_for / против.Вот ссылка на github для драгоценного камня: https://github.com/brady8/thumbs_up. Драгоценный камень прекрасно работает с методами voice_up и voice_down, но когда я изменяю его на voice_exclusively_for (который должен заменить предыдущий голос с понижением / повышением), я получаюследующая ошибка в моем журнале разработки:
ActiveRecord::RecordInvalid (Validation failed: Voteable has already been taken):
app/controllers/posts_controller.rb:97:in `vote_up'
Похоже, что метод внутри драгоценного камня не очищает предыдущий голос перед началом нового голосования.Вот мой код в posts_controller:
def vote_up
@user = current_user
@post = Post.find(params[:id])
@user.vote_exclusively_for(@post)
redirect_to (..)
end
Вот код из драгоценного камня:
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 не удаляет предыдущий голос,Любая помощь будет принята с благодарностью.