在Ruby on Rails中更改request.remote_ip的值

时间:2010-01-08 17:43:00

标签: ruby-on-rails ruby geokit

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

谢谢。

7 个答案:

答案 0 :(得分:14)

如果您希望在整个应用程序中使用此功能,则可能更好/更轻松地覆盖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地址随处可用

答案 1 :(得分:5)

你可以通过在测试环境中为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禁止,地理位置等的功能测试之前,我不得不使用它。

答案 2 :(得分:4)

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

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

request.remote_ip现在返回1.2.3.4

答案 3 :(得分:3)

我现在最终做的是将此代码放在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。每次更改值时都必须重新启动服务器!

答案 4 :(得分:3)

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

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

答案 5 :(得分:3)

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

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

答案 6 :(得分:0)

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

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

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

HTH