Rails thumbs_up gem voice_exclusively_for - PullRequest
       0

Rails thumbs_up gem voice_exclusively_for

2 голосов
/ 08 августа 2011

В настоящее время я использую гем 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 не удаляет предыдущий голос,Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 08 августа 2011

Попробуйте запустить это в консоли и посмотрите, работает ли оно:

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, чтобы убедиться, что он не возвращает пустой массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...