Реализация voice_fu в приложении рельсов (или альтернативах)
-
22-09-2019 - |
Вопрос
Я уже некоторое время пытаюсь реализовать надежную систему голосования в Rails, но у меня ничего не получается.Изначально я построил свою собственную систему голосования, но она была упрощенной.
Короче говоря, он просто увеличил votes_count
столбец в Answer
модель с использованием кэша счетчиков.Некоторое время у меня это работало нормально, пока я не открыл voice_fu и не понял, насколько более надежной могла бы быть моя система голосования.Я немедленно установил его и провел все выходные, разбирая свое приложение, пытаясь заставить его работать.
Здесь, в Stack Overflow, я нашел еще несколько вопросов, связанных с этим плагином, но ни один из них не нашел окончательного решения.Вот мой код:
ответы_контроллер.рб:
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
ответ.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>
маршруты.рб:
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.
У кого-нибудь есть предложения?Должен ли я просто вернуться к своей старой системе голосования, сделанной вручную?Есть ли другой плагин или метод голосования, о котором я не слышал?
Решение
Я думаю, что первым шагом будет заставить его работать через консоль.Судя по последней ошибке в вашем комментарии, похоже, что ваши модели настроены неправильно.В вашей 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
Другие советы
Ответ 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