2014-05-20 3 views
1

Ruby on Rails 3.2 응용 프로그램을 사용하여 사용자가 Youtube_it Rails gem으로 YouTube에 직접 비디오를 업로드 할 수 있습니다. 비디오가 업로드 된 후 사람들은 비디오에 투표 할 수 있습니다. 누구나 비디오에 투표 할 수 있고 비디오에 투표하려면 (등록자를 사용하여) 등록 할 필요가없는 지금 설치해야합니다.한도 당 IP 주소 1 회당 투표 수 1 회당

투표 수를 IP 주소 당 하루에 1 표로 제한하고 싶습니다. 한 사람이 IP 주소로 투표 한 경우 24 시간 동안 다시 투표 할 수 없습니다.

저는 레일을 처음 사용하기 때문에이를 구현하는 방법을 생각할 수 없습니다. request.remote_ip을 사용하여 사용자 IP 주소를 저장하는 모델을 만들어야한다고 생각합니다. 투표를 하루에 한 번만 어떻게 제한합니까?

내 routes.rb

resources :videos do 
collection do 
    put '/vote_up/:id' => "videos#vote_up", :as => :vote_up 
end 
new do 
    post :upload 
    get :save_video 
end 
end 

내 동영상

이 보여보기

<%= link_to vote_up_videos_url(@video.id), class: "btn btn-main", :method => :put do %> 
    <i class="fa fa-thumbs-up"></i> Upvote this video 
<% end %> 

비디오 컨트롤러

def vote_up 
@video = Video.find(params[:id]) 
@video.update_attribute(:votes_up, (@video.votes_up.to_i + 1)) 
redirect_to @video 
end 
+0

어떻게하면 둘 이상의 사용자가 거기 경우 수행 IP 주소? 하나의 주소에서 2 명이, 아마도 캐리어 급 NAT를 사용하는 이동 통신사는 하나의 IP 주소를 사용하는 수천 명의 사용자를 가질 수 있습니다. –

+0

사용자가 동일한 비디오 또는 비디오에서 다시 투표 할 수 없습니까? 등록 된 사용자 만 투표 할 수 있습니까? – spickermann

+0

당신은 이것을 원하지 않습니다. 요청 IP 주소가 어디에서 왔는지 체인을 따라 어디에서 알 수있는 방법이 없습니다. 점차적으로 IPv4 주소의 부족으로 인해 ISP는 결국 NAT를 구현해야합니다. 즉, 사용자가 보는 하나의 IP 주소를 수백 명의 개인에게 쉽게 매핑 할 수 있습니다. 조직 (도서관, 무선 인터넷 사이트, 대학) 및 셀 연결에 대해서도 마찬가지입니다. –

답변

1
# in controller 
def vote_up 
video = Video.find(params[:id]) 
video.vote!(request.ip) 

redirect_to video 
end 

# in video model 
def vote!(ip) 
    unless Vote.recent.exists?(:ip => ip, :video_id => id) 
    increment!(:votes_up) 
    Vote.create(:ip => ip, :video_id => id) 
    end 
end 

# in vote model 
class Vote < ActiveRecord::Base 
    scope :recent, -> { where("created_at > ?", 24.hours.ago) } 
end 

# migration 
class CreateVotes < ActiveRecord::Migration 
    def change 
    create_table :votes do |t| 
     t.integer :video_id 
     t.string :ip 
    end 
    add_index :votes, :video_id, :ip 
    end 
end 
+0

이것은 내가 필요한 것에 완벽하게 작동했습니다. 정말 감사. – stiweb2003