0

私は、redditに似た単純な賛成/反対のシステムを作成しています。このシステムでは、ユーザーは何かに賛成/反対し、必要に応じて考えを変えることができます。

コントローラの「作成」アクションをAJAXで呼び出すページがあります。コントローラは、レコードを作成して適切なjs.erbを返すことに問題はありません。ただし、既存の投稿が存在するかどうかを確認したいので、存在する場合は破棄したいと思います。私のコントローラーは次のようになります。

def create
    @vote = GameVote.new
    @vote.game_id = params[:game_id]
    @vote.vote = params[:vote]
    @vote.user_id = session[:user_id]

    existing_vote = GameVote.where(whatever)

 respond_to do |format|
   if @vote.save
    format.js
   end
  end
end

真ん中のクエリを無視しているようで、新しいエントリを保存する前に存在する場合は破棄できません。何か案は?

4

2 に答える 2

3

delete + createのペアではなく、既存のGameVote(存在する場合)を更新する方が自然なようです。

これを行うには、次を置き換えます。

@vote = GameVote.new
@vote.game_id = params[:game_id]
@vote.vote = params[:vote]
@vote.user_id = session[:user_id]

existing_vote = GameVote.where(whatever)

と:

@vote = GameVote.where(game_id: params[:game_id], user_id: session[:user_id]).first_or_initialize
@vote.vote = params[:vote]
于 2012-04-10T06:11:35.467 に答える
1

試す :

@vote = GameVote.find_or_create_by_game_id_and_user_id(params[:game_id], session[:user_id])
OR
@vote = GameVote.find_or_create(:game_id => params[:game_id], :user_id => session[:user_id])

@vote.vote = params[:vote]
于 2012-04-10T06:24:01.790 に答える