我有一个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
答案 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