Реализация voice_fu в приложении rails (или альтернативах)

Некоторое время я пытался реализовать надежную систему голосования в Rails, но у меня не получалось. Изначально я построил собственную систему голосования, но она была упрощенной.

В двух словах, он просто увеличил столбец votes_count в модели Answer, используя кеш-счетчик. Какое-то время у меня это работало нормально, пока я не открыл для себя voice_fu и не понял, насколько более надежной может быть моя система голосования. Я сразу же установил его и провел все выходные, разбирая свое приложение, пытаясь заставить его работать.

Я нашел несколько других вопросов здесь, в Stack Overflow, связанных с этим плагином, но ни один из них не дал окончательного решения. Вот мой код:

answer_controller.rb:

def vote_up
    answer = Answer.find(params[:id])
    current_user.vote_up(answer), :voter_id => current_user.id
    redirect_to :back
end

voices_controller.rb:

def create
  @quote = Answer.find(params[:answer_id])

  respond_to do |format|
    if current_user.vote(@answer, params[:vote])
      format.rjs  { render :action => "create", :vote => @vote }
      format.html { redirect_to root_url }
    else
      format.rjs  { render :action => "error" }
      format.html { render :action => "new" }
      format.xml  { render :xml => @vote.errors, :status => :unprocessable_entity }
    end
  end
end

answer.html.erb: (здесь два разных метода, ни один из них не работает)

<span id="vote_form"  style="float: right;">
  <%= link_to "Vote up", :url => vote_up_answer_path(answer) %>
  /
  <%= link_to_remote "Down", :
    url => user_answer_votes_path(answer.user, answer,  :vote => :false, :format => :rjs), :method => :post
  %> 
</span>

<span id="<%= answer.id %>_vote_score" class="vote_score">
  <%= answer.votes_for - answer.votes_against %>
</span> 

маршруты.rb:

map.resources :users, :member => { :suspend => :put, :unsuspend => :put, :purge => :delete } do |user|
  user.resources :votes
  user.resources :answers do |answer|
    answer.resources :votes
  end
end
map.resources :answers, :has_many => :votes, :member => {:vote_up => :post, :vote_down => :post}

Я использую Rails 2.3.5.

У кого-нибудь есть предложения? Должен ли я просто вернуться к своей старой самодельной системе голосования? Есть ли другой плагин или метод голосования, о котором я не слышал?


person goddamnyouryan    schedule 22.02.2010    source источник
comment
Vote_fu отличный. Что конкретно не работает?   -  person Jonathan    schedule 22.02.2010
comment
мне тоже кажется супер! Вот почему я действительно хочу, чтобы это работало! Кажется, что мой интерфейс link_to не работает... он просто не добавляет голосов, когда я нажимаю. кроме того, в консоли, когда я пытаюсь u = User.first a = Answer.last u.votes_for(a), я получаю сообщение об ошибке: неизвестный атрибут: избиратель... я не знаю, как это исправить.   -  person goddamnyouryan    schedule 22.02.2010


Ответы (2)


Я думаю, что первым шагом будет заставить его работать через консоль. Судя по последней ошибке в вашем комментарии, возможно, ваши модели настроены неправильно. В вашей модели User у вас должно быть следующее:

#In User.rb
acts_as_voter

#In Answer
acts_as_votable

Кроме того, убедитесь, что вы применили rake:migrate к своей базе данных, а затем попробуйте это в консоли:

u = User.first 
a = Answer.last 
u.votes_for(a)

Когда я использовал это в прошлом, у меня было действие контроллера, которое выглядело следующим образом:

def vote
  @question = Question.find(params[:id])
  if params[:vote] == 'up'      
    current_user.vote_for(@question)
  elsif params[:vote] == 'down'      
    current_user.vote_against(@question)
  end
  redirect_to @question
end
person Jonathan    schedule 22.02.2010

Ответ jt помог мне заставить его работать. В моем контроллере не было метода vote_for из коробки. Я думаю, что они должны добавить это в документацию.

def vote
    @question = Question.find(params[:id])
    if params[:vote] == 'up'      
      current_user.vote_for(@question)
    elsif params[:vote] == 'down'      
      current_user.vote_against(@question)
    end
    redirect_to @question
  end
person Dan Voell    schedule 16.01.2013