2010-02-22 1 views
3

Я пытаюсь внедрить надежную систему голосования в Rails в течение некоторого времени, но боролся. Первоначально я построил свою собственную систему голосования, но был упрощен.Реализация vote_fu в приложении rails (или альтернативы)

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

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

answers_controller.rb:

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

votes_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> 

routes.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.

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

+0

Vote_fu отлично. Что конкретно не работает? – Jonathan

+0

мне кажется тоже здорово! Вот почему я действительно хочу заставить его работать! Кажется, что мой интерфейс link_to не работает ... он просто не добавляет никаких голосов, когда я нажимаю. дополнительно, в консоли, когда я пытаюсь и = User.first а = Answer.last u.votes_for (а) Я получаю сообщение об ошибке, как: «Неизвестный атрибут: избирателю» ... Я не знаете, как это исправить. – goddamnyouryan

ответ

1

Я думаю, что первым шагом будет заставить его работать через консоль. Из последней ошибки в вашем комментарии кажется, что ваши модели настроены неправильно. В вашей 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 
0

Ответ 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