Ruby on rails RubyonRails-通过IP限制点击

Ruby on rails RubyonRails-通过IP限制点击,ruby-on-rails,ruby,authentication,session,blogs,Ruby On Rails,Ruby,Authentication,Session,Blogs,我对rails还不熟悉,所以请放心。我已经创建了一个博客,通过使用类似Facebook的“喜欢”功能,可以对帖子进行“投票”。我不使用任何身份验证,但想通过IP限制对特定帖子的投票。也就是说,一旦有人投票给某个帖子,他们就不能再投票了(当然,除非他们重置路由器) 我觉得这应该是我通过修改投票或帖子模型来影响的,但我担心这与会议有关,我还没有任何经验 如果您需要我发布任何代码,请告诉我。这是票务控制员 class VotesController < ApplicationController

我对rails还不熟悉,所以请放心。我已经创建了一个博客,通过使用类似Facebook的“喜欢”功能,可以对帖子进行“投票”。我不使用任何身份验证,但想通过IP限制对特定帖子的投票。也就是说,一旦有人投票给某个帖子,他们就不能再投票了(当然,除非他们重置路由器)

我觉得这应该是我通过修改投票或帖子模型来影响的,但我担心这与会议有关,我还没有任何经验

如果您需要我发布任何代码,请告诉我。这是票务控制员

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
class VotesController
您可以将
ip\u地址
属性添加到您的
投票
表中,并
验证:ip\u地址的唯一性
,以确保一个ip只能投一票。

立即想到两种方法,可能还有其他方法。两者都需要在数据库中存储IP

  • 阻止使用唯一性验证创建投票

    class Vote < ActiveRecord::Base
      validates_uniqueness_of :ip_address
      ...
    end
    
    类投票
  • 阻止在控制器中创建投票

    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
    
    class VotesConrollerrequest.remote_ip}))
    结束
    结束
    结束
    

  • 我会做EmFi和bensie说的,并将IP地址与投票一起存储,但你可能还想研究创建一个你想要阻止的IP黑名单,因为这些IP代表流行的代理服务器(例如,列表中的许多代理)


    当您添加到列表中时,它至少会让用户更难作弊。

    这太好了……我如何将ip地址从表单传递到表中。我创建了列ip\u地址。我尝试了:request.remote\u ip,但没有成功。您甚至不需要在表单中收集ip地址。让控制器通过就行了。请参见第二种方法中的Vote.create行,了解如何执行此操作。(假设列名为ip_Address我已在上面发布了我的投票控制器代码。我遇到了问题,可能是因为收集了post_id.FYI-您不想走这条路线的原因是因为用户很容易修改。您需要将其作为EmFi发布在您的控制器中。非常感谢。请参阅我对EmF的评论。)i、 需要一些关于如何传递到表的帮助。我是新手。很好的捕获,远程ip应该使用HTTP_客户端_ip或HTTP_X_转发_作为头来获取代理背后的ip。但是,它可能不是完美的。