每个限制每天每个IP地址的Rails投票数

时间:2014-05-20 01:43:07

标签: ruby-on-rails session voting

我有一个Ruby on Rails 3.2应用程序,用户可以使用Youtube_it Rails gem将视频直接上传到youtube。视频上传后,人们可以对视频进行投票。我现在设置了任何人都可以对视频进行投票,他们无需注册(使用设计)对视频进行投票。

我想将每个IP地址的投票限制为每天1票。如果某人通过IP地址投票,他们将无法再24小时投票。

我是rails的新手,我似乎无法弄清楚如何实现它。我想我必须使用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

1 个答案:

答案 0 :(得分: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