设计gem(Ruby on Rails):最后一个signed_in总是返回127.0.0.1,如何获得真正的IP?

时间:2013-10-26 08:44:46

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

我想获得系统的真实IP,以便我可以进一步获取位置(使用地理编码器gem)。我正在使用devise gem的可跟踪模块来获取用户的IP。当我尝试对IP进行地理编码时,它会失败,因为devise返回的 last_signed_in_ip 始终为127.0.0.1。我仔细检查了浏览器中的位置权限,这似乎不是一个问题,因为它可以跟踪那里的位置。什么可能是错的?

此外,是否有更好的方法来找出一个位置(除了跟踪IP地址然后对其进行地理编码?)。是否可以再次要求用户允许在应用程序内进行位置跟踪,以防他不允许或不知道此类设置?

提前感谢所有帮助。

由于

2 个答案:

答案 0 :(得分:0)

request.remote_ip将解决您的问题...

它永远不会返回您自己的m / c地址,而是如果您需要远程地址来(测试)地理编码,我建议将127.0.0.1添加到数据库表中,使IP地址与位置相匹配

你可以像这样硬编码用于测试目的:

if request.remote_ip == '127.0.0.1'
  # Hard coded remote address
  '123.45.67.89'
else
  request.remote_ip
end

答案 1 :(得分:0)

如果您想以编程方式返回外部IP地址,则需要从该地址访问您的应用程序。

当您在localhost访问您的应用时,request.remote_ip将返回127.0.0.1,因为这是您的本地主机IP地址。

要解决此问题,您可以将开发端口(通常为3000)从路由器转发到PC,然后通过在浏览器中输入外部IP地址而不是localhost来访问您的应用程序(例如:123.123.123.123:3000)

或者将您的外部IP地址添加到指向localhost的主机文件中(例如:localhost 123.123.123.123),然后通过您的外部IP地址浏览到您的应用程序。