如何在 Rails 中获取客户的 IP 地址?
Posted
技术标签:
【中文标题】如何在 Rails 中获取客户的 IP 地址?【英文标题】:How do I get a client's ip address in Rails? 【发布时间】:2012-11-09 22:58:28 【问题描述】:我的控制器中有一个函数,它从需要输入 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 调用该函数时,该对象为零。如果我输入一个静态 IP 地址,尽管它会产生正确的输出。如果 remote.request_ip 不这样做,那么获取 IP 地址的正确方法是什么?
当我尝试在控制台中输入“request.remote_ip”时,它会返回“未定义的局部变量或方法“请求”来自 main”
【问题讨论】:
您是在开发中还是在生产中测试它?此外,它在 Rails 控制台上不起作用是正常的,因为 Rails 控制台不响应 http 调用,因此没有请求对象。 Rails: Get Client IP address的可能重复 【参考方案1】:您的问题是否有错字,或者您真的在调用 remote.request_ip?
正确的方法是request.remote_ip
【讨论】:
【参考方案2】:这看起来像是应该在模型中的代码,所以我假设这就是该方法所在的位置。如果是这样,您不能(至少“开箱即用”)从模型访问请求对象,因为它源自 HTTP 请求——这也是您从 main 获得“未定义的局部变量或方法“请求”的原因" 在您的控制台中。
如果这个方法还没有在你的模型中,我会把它放在那里,然后从你的控制器调用它并传入 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> 并在需要时将其用于测试。
【讨论】:
这是正确的。request
对象仅在请求的上下文中可用,这意味着:控制器和视图。它在模型(或邮件)中不可用。因此,您必须获取 ip 并将其传递给模型方法,如本例所示。【参考方案3】:
HTTP 请求: request.ip
(正如 sebastianh 在他的回答中指出的那样)
也可用作:request.env['action_dispatch.request_id']
HTTPS 请求: request.env['HTTP_X_FORWARDED_FOR'].split(/,/).try(:first)
【讨论】:
以上是关于如何在 Rails 中获取客户的 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章