如何在Rails中获取客户端的IP地址?

时间:2012-11-21 16:22:06

标签: ruby-on-rails ruby-on-rails-3

我的控制器中有一个函数,它调用另一个需要输入ip地址的模型的函数

  def get_location_users
    if current_user
      return current_user.location_users
    else

      l = Location.find_by_ip(request.remote_ip)

      lu = LocationUser.new({:location_id => l.id, :radius => Setting.get("default_radius").to_i})
      return [lu]
    end
  end

从我收集的remote.request_ip给你ip地址,但是当我用request.remote_ip调用该函数时,对象是nil。如果我输入静态IP地址虽然它产生正确的输出。如果remote.request_ip不这样做,获取IP地址的正确方法是什么?

当我尝试在控制台中输入“request.remote_ip”时,它会从“main”返回“未定义的局部变量或方法”请求

3 个答案:

答案 0 :(得分:6)

您的问题中是否有拼写错误,或者您是否真的在调用remote.request_ip?

正确的方法是request.remote_ip

答案 1 :(得分:3)

这看起来应该在模型中的代码,所以我假设这是该方法的位置。如果是这样,你不能(至少“开箱即用”)从你的模型访问请求对象,因为它来自HTTP请求 - 这也是你从主要获得“未定义的局部变量或方法”请求的原因“在你的控制台里。

如果你的模型中没有这个方法,我会把它放在那里,然后从你的控制器调用它并传入request.remote_ip作为参数。

def get_location_users(the_ip)
  if current_user
    return current_user.location_users
  else
    l = Location.find_by_ip(the_ip)
    lu = LocationUser.new({:location_id => l.id, :radius => Setting.get("default_radius").to_i})
    return [lu]
  end
end

然后,在你的控制器::

SomeModel.get_location_users(request.remote_ip)

另外,请注意,如果没有匹配的记录,“Location.find_by_ip”将返回nil。

并且,您可以使用 app.get“some-url”在控制台中发出请求,然后您可以从请求对象 app.request.remote_ip 访问request_ip strong>并在需要时使用它进行测试。

答案 2 :(得分:2)

  • HTTP请求: request.ip(正如塞巴斯蒂安在回答中指出的那样)

    也可用作:request.env['action_dispatch.request_id']

  • HTTPS请求: request.env['HTTP_X_FORWARDED_FOR'].split(/,/).try(:first)