3

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 を使用しています。

誰か提案はありますか?昔の手作りの投票システムに戻るべきですか? 聞いたことのない別の投票プラグインまたは方法はありますか?

4

2 に答える 2

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
于 2010-02-22T14:54:06.677 に答える
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
于 2013-01-16T14:37:30.983 に答える