Rails 4 - 我如何自动检测用户的位置并将其显示在 Web 应用程序上?
Posted
技术标签:
【中文标题】Rails 4 - 我如何自动检测用户的位置并将其显示在 Web 应用程序上?【英文标题】:Rails 4 - How would I automatically detect a user's location and display it on the web app? 【发布时间】:2015-08-19 18:26:48 【问题描述】:我目前有一个正在运行的应用程序,我想让 Rails 通过 IP 地址检测访问者的位置,并在我的网站主页上显示城市和州。例如,它会显示“Hello Name from City, State”。
访客无需输入任何内容。我知道诸如 GeoIP 和 Geocode 之类的东西。据我所知,它们用于从 IP 搜索位置,反之亦然,但它们需要手动输入信息。
我需要它在用户访问我的主页时自动执行此操作。我有一个 Post Controller 和一个主页,我只想在主页的 HAML 中添加一些代码来显示信息。我计划根据位置对用户的帖子进行分类,它将自动填写(我目前有一个用户必须手动输入的位置字段)。如果你也能告诉我如何做到这一点,那就太好了。
如需我需要的实时示例,请访问weather.com,您将在主页上看到您所在的城市(和天气)。
附加信息:我是 Rails 4 的新手(两周前开始),所以请告诉我最简单的方法,如果可能的话,请指点我视频资源。
【问题讨论】:
你看过github.com/geokit/geokit-rails吗? 请查看post 我选择关闭它,因为它太宽泛了。任何潜在的解决方案都需要比“我只想在主页的 HAML 中添加一些代码以显示信息”多一点思考。 Geokit 无法满足我的需求。需要手动输入IP。 @max 我完全不同意。我要求一个非常具体的请求和资源来帮助我实施它,因为我是新手。仅仅因为我想做的很简单(在主页上显示信息)并不意味着它是“广泛的”。 【参考方案1】:添加到 gemfile
gem 'geocoder'
运行 bundle install
并重新启动您的服务器
将<%= request.location.city %>
放在您希望城市名称出现的视图中。
【讨论】:
这可以在本地主机上工作还是网站需要上线?如果我的站点当前在本地计算机上,我将如何对其进行测试? 是的,抱歉应该提到在本地不起作用,因为没有有效的 ip。如果你想在控制器中操作东西,你可以,但这不是必须的。例如,您可以在控制器中拥有@city = request.location.city
并做一些事情,然后在视图中渲染<%= @city %>
。
@Laser,我做了同样的事情,但没有获取位置,没有价值到达那里
@Laser 我添加了 gem,安装了它,并在我的视图页面中添加了 。它显示为空。也在实时服务器中运行。我怎么了?
所以本地它应该是空的,但如果它发生在部署中,很可能不是你,而是使用的默认地理编码器的服务,freegeoip。见github.com/fiorix/freegeoip/issues/159#issuecomment-189754228【参考方案2】:
有许多提供 RESTful JSON API 的服务会根据 IP 地址为您提供位置数据,例如:http://www.telize.com/
您需要做的就是在您的控制器中,通过request.env['REMOTE_ADDR']
捕获 HTTP 请求 (Rack::Request
) 的源并提供给 Geo API。
【讨论】:
【参考方案3】:另一种解决方案是将 ruby gem 用于 Yandex 定位器 (https://tech.yandex.ru/locator/)。 Yandex 定位器是一项服务,可在圆圈所划定的区域内查找移动设备。该服务返回经度、纬度和精度。 https://github.com/sergey-chechaev/yandex_locator
client = YandexLocator::Client.new(api_key: 'api key', version: '1.0')
result = client.lookup(ip: address_v4: '178.247.233.3' )
result.position
# => "altitude"=>0.0, "altitude_precision"=>30.0, "latitude"=>41.00892639160156, "longitude"=>28.96711158752441, "precision"=>100000.0, "type"=>"ip"
【讨论】:
以上是关于Rails 4 - 我如何自动检测用户的位置并将其显示在 Web 应用程序上?的主要内容,如果未能解决你的问题,请参考以下文章
如何自动获取用户的地理位置值并将其作为 POST 请求发送到后端
Webpack:如何使角度自动检测 jQuery 并将其用作 angular.element 而不是 jqLite?