【问题标题】:Change value of request.remote_ip in Ruby on Rails在 Ruby on Rails 中更改 request.remote_ip 的值
【发布时间】:2010-01-08 17:42:59
【问题描述】:

出于测试目的,我想更改 request.remote_ip 的返回值。在我的开发机器上时,它总是返回 127.0.0.1,但我想给自己不同的假 IP 来测试我的应用程序的正确行为,而无需先将其部署到实时服务器!

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby geokit


    【解决方案1】:

    如果您希望在整个应用程序中使用此功能,在app/helpers/application_helper.rb 中覆盖 remote_ip 方法可能会更好/更容易:

    class ActionDispatch::Request #rails 2: ActionController::Request
      def remote_ip
        '1.2.3.4'
      end
    end
    

    而且1.2.3.4地址随处可见

    【讨论】:

      【解决方案2】:

      您可以使用以下方式修改请求对象:

      request = ActionController::Request.new('REMOTE_ADDR' => '1.2.3.4')
      

      request.remote_ip 现在返回 1.2.3.4

      【讨论】:

      • 这使得带有新 IP 的请求仅可用于当前范围。我需要一种方法来为整个应用程序更改它。
      • 你是对的,我添加了一个新答案来为你的整个应用程序启用它
      【解决方案3】:

      您可以通过在通常未定义的测试环境中为 remote_ip 值创建一个mutator来作弊。

      例如,使用以下内容更改 test/test_helper.rb 中的类:

      class ActionController::TestRequest
        def remote_ip=(value)
          @env['REMOTE_ADDR'] = value.to_s
        end
      end
      

      然后,在测试期间,您可以根据需要重新分配:

      def test_something
        @request.remote_ip = '1.2.3.4'
      end
      

      这可以在单独的测试中完成,也可以在您的设置例程中进行,只要合适。

      在编写验证 IP 禁止、地理位置等功能测试时,我必须使用它。

      【讨论】:

      • 这更符合我想要的方向。但我想让它可用于开发环境/手动测试。有什么地方可以放@env['REMOTE_ADDR'] = "1.2.3.4"?
      【解决方案4】:

      rails 4.0.1 rc。经过一个小时的搜索,在挖掘代码时发现了这个简单的解决方案:)

      get '/', {}, { 'REMOTE_ADDR' => '1.2.3.4' }
      

      【讨论】:

        【解决方案5】:

        对于集成测试,这适用于 rails 5:

        get "/path", params: { }, headers: { "REMOTE_ADDR" => "1.2.3.4" }
        

        【讨论】:

          【解决方案6】:

          我现在最终做的是将此代码放在 config/environments/development.rb 文件的末尾,以确保它仅在开发时执行

          # fake IP for manuel testing
          class ActionController::Request
            def remote_ip
              "1.2.3.4"
            end
          end
          

          所以这会在服务器启动时将 remote_ip 设置为 1.2.3.4。每次更改值都必须重新启动服务器!

          【讨论】:

            【解决方案7】:

            此答案仅适用于 rails3(我在尝试为 rails 3 回答类似问题时找到了此答案),

            所以我会在这里发布,以防有​​人试图在 Rails3 环境中做同样的事情

            class ActionDispatch::Request
              def remote_ip
                '1.2.3.4'
              end
            end
            

            HTH

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-12-01
              • 2018-10-22
              • 1970-01-01
              • 1970-01-01
              • 2021-11-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多