我一直试图在Rails中实施一个强大的投票系统一段时间,但一直在努力。最初我建立了自己的投票系统,但这很简单。
简而言之,它只是使用计数器缓存增加votes_count
模型中的Answer
列。这对我有用一段时间,直到我发现vote_fu并意识到我的投票系统有多强大。我立即安装了它并花了整个周末撕毁我的应用程序试图让它工作。
我在Stack Overflow上发现了一些与此插件相关的其他问题,但实际上没有一个问题能够找到最终的解决方案。这是我的代码:
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 :(得分: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
答案 1 :(得分: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