2013-07-04 2 views
1

유권자 ip_address가 투표를 제한하는 투표 시스템을 구현하려고합니다.IP 주소 당 하나의 투표

게시물 모델에 many_votes가 있고 투표가 게시물 모델에 속합니다.

제 질문은 어떻게 그리고 어디서 "current_user"를 정의하고 어떻게 뷰에서 구현할 수 있습니까? 사람을 제외하고

<%= link_to(post_votes_path(post), :method => 'post') do %> 
<%= song.votes.size %> 

작품 벌금 투표 할 수와 나는 그것을 중지하려면 :

현재 나는 다음과 같은 표를 작성하고 있습니다. 제발 내가 처음부터이 기능을 배우려고 노력하고있는 보석을 찾고 있지 않습니다.

건배. 조치를 생성하기위한

def create 
@post = Post.new(params[:post]) 

respond_to do |format| 
    if @post.save 
    format.html { redirect_to root_url, notice: 'Post was successfully created.' } 
    else 
    format.html { render action: "new" } 
    end 
end 
end 

투표 컨트롤러 코드 : 고유 유효성 검사 제약 조건 ip 열에서

def create 
@post = Post.find(params[:post_id]) 
@vote = @post.votes.create 
respond_to do |format| 
    format.html { redirect_to root_url } 
    #format.js 
end 
end 
+0

사용자를 어떻게 저장하는지 말할 수 있습니까? – AnkitG

+0

현재 사용자 테이블이 없습니다. 투표 테이블에 voter_id를 추가하려고합니다. – Joshua

+2

투표 테이블에 'voter_ip'컬럼을 추가하고 유권자의 ip를 입력해야합니다 :'@ post.votes.create (voter_ip : request.remote_ip)'(변수'request'는 컨트롤러에서만 사용 가능합니다 , 요청을받을 때) @Gene이 말했듯이 투표 모델에'validates : voter_id, uniqueness : true'를 추가했다. – MrYoshiji

답변

1

MrYoshiji가 제안한 것처럼 투표 테이블에 voter_ip 열을 추가해야합니다.

당신이이 골대를 확인합니다 글/투표 컨트롤러

if @post.votes.where(voter_ip: request.remote_ip).empty? 
    @post.votes.create(vote: params[:post_vote]) 
end 

이 AR where 절을 추가 현재 IP에서 어떤 표를 가지고 있습니다. 득표가 기록되지 않은 경우 매개 변수 값이 post_vote

인 새 투표가 추가됩니다. vote 모델에 제약 조건을 추가하려는 경우 범위 유효성 검사를 수행해야합니다.

validates_uniqueness_of :voter_ip, scope: :post_id 

고유성 제약 voter_ippost_id과의 조합에 적용되는 범위 파라미터를 이용

대신 단독 voter_ip.

+0

범위 유효성 검사는 제가 찾고있는 것입니다. 완벽하게 일했습니다. 감사. 레일 4에 – Joshua

+1

이 있으면 where.not 절을 사용할 수 있습니다. http://blog.remarkablelabs.com/2012/12/not-equal-support-for-active-record-queries-rails-4-countdown-to-2013 – scaryguy

+0

건배, "vote_for"와 같은 것을 어떻게 호출 할 수 있는지 궁금합니다. "보기. 예 : 현재 사용자 ip_가 게시물에 투표했는지 확인합니다. – Joshua

1

투표 테이블의 요구

여기에 내 게시물 컨트롤러 코드입니다. 그런 다음 ip 당 하나 이상의 득표를 기록하려고 시도하면 컨트롤러의 저장이 실패합니다.이 오류는 감지하여 오류를 플래싱하는 데 사용할 수 있습니다. 더 나은 답변을 얻으려면 컨트롤러 코드를 게시해야합니다.

+0

컨트롤러 코드가있는 원래 게시물을 편집했습니다. – Joshua

+0

레일스가 ip 열을 자동으로 감지하여 IP 주소와 일치시키는 지 궁금한가요? – Joshua

+0

@ Joshua 아니, 컨트롤러에서 함께 링크해야합니다. – tadman