2014-05-20 105 views
1

我有一個Ruby on Rails 3.2應用程序,用戶可以通過Youtube_it Rails gem將視頻直接上傳到youtube。視頻上傳後,人們可以對視頻進行投票。現在我已經設置了任何人都可以對視頻進行投票,並且他們不必註冊(使用設計)對視頻進行投票。Rails按IP地址每次限制每天投票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地址?也許有兩個人在一個地址,或者使用運營商級NAT的運營商可能會有數千個用戶使用一個IP地址。 –

+0

用戶是不是應該能夠在同一個視頻或任何視頻上再次投票?只能註冊用戶投票嗎? – spickermann

+0

你不想這樣做。您無法控制並且無法知道請求IP地址來自哪裏。由於缺乏IPv4地址,ISP越來越多地被迫實施NAT,這意味着您看到的一個IP地址可以輕鬆映射到數百個個人。組織(圖書館,wifi點,大學)和小區連接也是如此。 –

回答

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