2012-04-10 3 views
0

저는 reddit와 비슷한 간단한 upvote/downvote 시스템을 만들고 있는데, 사용자가 뭔가를 upvote/downvote하고 필요할 경우 마음을 바꿀 수 있습니다.레일즈 컨트롤러가 쿼리를 무시합니다.

내 컨트롤러의 '만들기'작업에 대한 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 

단지는 새 항목을 저장하기 전에 존재하는 경우를 파괴에서 저를 방지, 중간 쿼리를 무시하는 것 같다. 어떤 아이디어?

+0

귀하의 질문에 정확히 무엇입니까? 기존 투표를 찾는 방법? 그것을 삭제하는 방법? 당신이 보여주고있는 코드에서 문제가 무엇인지는 매우 불분명하다. – Mischa

+0

안녕하세요 @ Mischa - existing_vote = GameVote.where (뭐든간에) 해고 당하지 않습니다. 서버 콘솔 내에서 쿼리가 실행되는 것을 볼 수 없으며 그 이유를 파악할 수 없습니다. 적절한 논쟁을 통해 레일 콘솔에서 정상적으로 작동하지만 컨트롤러가 실제로이를 무시하는 것처럼 보입니다. 왜 그런지 궁금합니다. – opticon

+1

레일즈는 필요할 때만 쿼리를 실행하기 때문입니다. 'existing_vote'로 아무 일도하지 않으므로 쿼리가 실행되지 않습니다. Rails에 내장 된 최적화 기능입니다. – Mischa

답변

3

delete 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] 
+0

안녕하세요 @ jdoe, 붙여 넣은 코드에서 undefined_method 오류가 발생했습니다. (NoMethodError ([ ']에 대한 정의되지 않은 메서드'first_or_initialize ': ActiveRecord :: Relation) :) - 파괴하는 것과 반대로 업데이트하고 싶습니다. 동일한 방법으로 이것을 수행하는 우아한 방법이 있습니까? – opticon

+2

'first_or_initialize'는 Rails 3.2 기능입니다. 하지만 여전히 find_or_initialize_by_ * 접근법을 사용할 수 있습니다. 레일즈 버전을 지정하지 않았으므로 좀 더 정확하게 대답 할 수 없습니다. – jdoe

+0

Hey @jdoe - 방금 3.1에서 3.2로 업그레이드했지만 여전히 같은 오류가 발생합니다. 지금까지 도움을 주셔서 감사합니다. – opticon

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] 
+0

Hey @Vik, 그들은 또한 undefined_method 오류를 던지고 있습니다. Rails 3.1.0을 사용하고 있습니다 - 업그레이드해야합니까? – opticon

+1

이 방법은 레일 3.0.9, 3.2+ – Vik

+0

에서 사용할 수 있습니다. 가능한 경우 답변으로 선택하겠습니다! 많은 감사합니다! – opticon

관련 문제