Rails に堅牢な投票システムを実装しようとしてしばらく経ちましたが、うまくいきませんでした。最初に独自の投票システムを構築しましたが、単純化されていました。
簡単に言えば、カウンター キャッシュを使用しvotes_count
てモデル内の列をインクリメントしただけです。Answer
これは、vote_fu を発見し、投票システムがどれほど堅牢であるかを理解するまで、しばらくの間うまくいきました。私はすぐにそれをインストールし、週末全体を使ってアプリケーションを分解し、動作させようとしました。
このプラグインに関連するスタック オーバーフローに関する他の質問をいくつか見つけましたが、実際に最終的な解決策を思い付くものはありませんでした。これが私のコードです:
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
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: (ここでは 2 つの異なる方法がありますが、どちらも機能しません)
<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 を使用しています。
誰か提案はありますか?昔の手作りの投票システムに戻るべきですか? 聞いたことのない別の投票プラグインまたは方法はありますか?