2013-01-18 4 views
0

Reddit 복제본을 만들 때 schneems의 멋진 소개를 Rails tutorial에 전달하고 "투표"구조를 확장하여 질문뿐만 아니라 주석도 처리하려고합니다 컨트롤러에 question_idcomment_id을 전달하는 방법을 알아내는 데 어려움을 겪고 있었기 때문에 사용량을 question_id으로 제한하는 대신 그에 따라 위 또는 아래로 투표를 할 수있었습니다.두 개의 다른 객체에 대해 동일한 "투표"컨트롤러 동작 사용

현재, 다음과 같이 정의, 내 VotesController에 불과 create 기능이있다 : 당신의 도움에 대한

def create 
    @vote = Vote.where(:question_id => params[:vote][:question_id], :user_id => current_user.id).first #the question_id is baked right in.. 
    if @vote 
     @vote.up = params[:vote][:up] 
     @vote.save 
    else 
     @vote = current_user.votes.create(params[:vote]) 
    end 
    redirect_to :back 
    end 

감사합니다!

답변

1

의견에 투표하려고하면 params[:vote]:question_id 대신 :comment_id이 포함되어야합니다. 맞습니까?

그래서 당신의 where

# for a question 
where(:question_id => params[:vote][:question_id], :user_id => current_user.id) 

# for a comment 
where(:comment_id => params[:vote][:comment_id], :user_id => current_user.id) 

당신은 params[:vote].has_key?(:question_id) 경우 확인하여 같은 여러 가지 방법으로 접근 할 하나 필요하지만 쉬운 옵션은 Hash#slice 사용하는 것입니다 :

where(params[:vote].slice(:question_id, :comment_id).merge(:user_id => current_user.id)) 
+0

감사합니다, 'Hash # slice' 링크를 올리기 위해서! 위의 코드는 질문에 게시 된 첫 번째 댓글에 잘 작동합니다. 그러나 투표 링크를 클릭해도 오류는 발생하지 않았지만 동일한 질문에 게시 된 후속 의견에 대해서는 투표 할 수 없었습니다. 설명으로, 각각의 질문은 'has_many' 의견입니다. Im은 왜 그 입력을 한 번만 가져 왔는지에 대해 확신하지 못했습니다. 각 comment_ids는 고유 한 피드입니다. 다시 한 번 감사드립니다! – daspianist

+0

이것 좀 더 살펴본 후, 나는 그것이 문제를 일으키는'Votes.rb' 모델의 유효성을 확인했다. 나는'validates : user_id, : uniqueness => {: scope => : question_id}'를 가지고 있는데, 사용자가 질문을 한 번 이상 투표하지 못하게한다. 그러나 동일한 '쇼'페이지에서 의견을 내 질문으로 렌더링하기 때문에 사용자로 문제를 일으키는 것은 질문 아래에 나타나는 하나의 의견에 대해서만 투표 할 수 있다고 생각합니다. 당신이 가진 통찰력은 위대 할 것이고, 다시 감사 할 것입니다. – daspianist

+1

예, [다형성 연관] (http://guides.rubyonrails.org/association_basics.html#polymorphic-associations)의 완벽한 사용 사례 인 것 같습니다. 기본적으로'Vote belongs_to : voteable, polymorphic : true'와'Question has_many : votes, as : : voteable'입니다. –

관련 문제