2009-11-20 81 views
3

我是新来的铁路,所以很容易。我创建了一个能够通过使用类似于Facebook的“喜欢”功能在帖子上“投票”的博客。我没有使用任何身份验证,但希望通过IP限制对特定职位的投票。也就是说,一旦有人投了一个帖子,他们就不能再投票了(除非他们重新设置路由器)。Ruby on Rails - 限制点击IP

我觉得这应该是我通过修改投票或帖子模型而影响到的东西,但是我担心它会与Sessions有关,这是......我还没有任何经验。

让我知道你是否需要我发布任何代码。这是票控制器。

class VotesController < ApplicationController 

    def create 
    @post = Post.find(params[:post_id]) 
    @vote = @post.votes.create!(params[:vote]) 

     respond_to do |format| 
     format.html { redirect_to @post} 
     format.js 
    end 
    end 
end 

回答

8

这样做的两种方式马上浮现在脑海中,可能还有其他方法。两者都需要在数据库中存储IP。

  1. 阻止使用唯一性验证创建投票。

    class Vote < ActiveRecord::Base 
        validates_uniqueness_of :ip_address 
        ... 
    end 
    
  2. 块从控制器被创建的投票

    class VotesConroller < ApplicationController 
        ... 
        def create 
        unless Vote.find_by_post_id_and_ip_address(params[:post_id],request.remote_ip) 
         posts.votes.create!(params[:vote].update({:ip_address => request.remote_ip})) 
        end 
        end 
    end 
    
+0

这是伟大的...我如何将IP地址从表格传递给表格。我创建了列ip_address。 – bgadoci 2009-11-20 16:21:53

+0

我试过了:<%= f.hidden_​​field:ip_address => request.remote_ip但没有奏效。 – bgadoci 2009-11-20 16:22:50

+1

你甚至不需要收集表单中的IP地址。只需让控制器通过它。有关如何做到这一点,请参阅第二种方法中的Vote.create行。 (假设列名是ip_address – EmFi 2009-11-20 16:25:47

0

你可以一个ip_address属性添加到您的votesvalidates_uniqueness_of :ip_address以确保只有一票可能来自一个IP。

1

我会做EMFI和bensie都表示和存储与投票的IP地址,但你可能也想看看创建您想要阻止的IP黑名单,因为它代表受欢迎的代理服务器(例如,http://proxy.org/列表中的许多代理)。

当你添加到列表中,它会使用户至少有点难以作弊。

+0

非常感谢,看到我对EmFi的评论,需要一个 – bgadoci 2009-11-20 16:23:50

+0

好的,remote_ip应该使用HTTP \ _CLIENT \ _IP或HTTP \ _X \ _FORWARDED \ _FOR标头获取代理IP。 但是,它可能不是完美无瑕的。 – EmFi 2009-11-20 16:31:53