存储HTML5地理位置数据

13

如何在Rails 3中存储和处理网站用户的地理位置(经度和纬度),以便在每个页面请求时检查我们是否已经在该用户的会话中持有这些详细信息(如果我们没有持有这些详细信息,则应从浏览器请求用户位置,然后将这些详细信息存储在会话中)?

2个回答

26

根据你的需求,我会说你实际上不需要使用ajax,因为大部分的处理将使用JS完成(如要求用户访问其位置、解析响应等),我建议使用JS来设置一个cookie,然后Rails就可以看到它了。

在你的控制器中

def action
  @lat_lng = cookies[:lat_lng].split("|")
end

在你的观点中

<%- unless @lat_lng %>
<script>
  getGeoLocation();
</script>
<%- end %>

在你的其中一个 JavaScript 文件中

function getGeoLocation() {
  navigator.geolocation.getCurrentPosition(setGeoCookie);
}

function setGeoCookie(position) {
  var cookie_val = position.coords.latitude + "|" + position.coords.longitude;
  document.cookie = "lat_lng=" + escape(cookie_val);
}
请注意,以上任何测试都无法检测用户是否有支持地理定位的浏览器,或者用户是否已授权(或拒绝)使用其位置,而且cookie将是会话cookie,并且JS不会检查cookie是否已设置。要在cookie上设置更复杂的信息,请查看http://www.quirksmode.org/js/cookies.html有关使用JavaScript进行地理位置定位的详细信息,请参见http://diveintohtml5.info/geolocation.html

这种解决方案的缺点是一些浏览器(如Firefox、Safari)会在每次页面加载时要求用户进行共享,直到他们按下“始终共享”或者厌烦了并按下“永不允许”。有什么想法可以避免这个问题吗? - Skurpi

6

这是Rails中非常常见的一种模式。在application_controller.rb或者application_helper.rb中(如果你想让它可以从多个控制器中访问),定义一个像以下这样的方法:

def lat_lng
  @lat_lng ||= session[:lat_lng] ||= get_geolocation_data_the_hard_way
end

||= 这个符号的作用是:“如果左侧为空,则检查右侧的部分,然后将该值赋给左侧以备下一次使用”。

这里的 @lat_lng 是一个实例变量... 对于这种情况来说可能有点过度,因为我怀疑获取会话数据并不需要太多实际工作,但是由于浏览器将要请求权限,你只希望执行一次。也许浏览器没有位置感知浏览器,所以你需要退而求其次,调用方法 get_geolocation_data_the_hard_way,你需要编写这个方法。


get_geolocation_data_the_hard_way 方法(你可以随意命名 :-))是请求发生的地方,例如向谷歌地图 API 发送请求,该 API 具有良好的文档化 JavaScript 接口,并提供各种巧妙的地理位置、接近度查找和其他酷炫的方法。如果您真的想减少对 API 的调用次数,该方法还可以执行类似于决定哪个纬度-经度对足够接近您的应用程序(例如,如果 1/2 英里足够接近),并缓存或持久化您关心的该位置的结果。但上述模式将确保每个会话仅进行一次调用。 - Tom Harrison
你如何从控制器/方法中发起Javascript调用? - Elliot
那是一个完全不同的问题 :-). 你不会在控制器中进行(JS)调用;相反,在视图中设置所需的变量,然后在页面末尾添加一个包含要执行的javascript的<script>标签。您可以像在HTML的其他部分中使用ERB标记一样,在脚本代码中引用控制器中设置的变量。或者,如果您不想显示任何内容,只需要数据,则可以从Ruby代码中调用Google Maps Web服务API:https://developers.google.com/maps/documentation/webservices/ - Tom Harrison
我实际上想在HTML5中使用地理定位,所以它必须是一个ajax请求 :) 有任何进一步的建议吗? - Elliot
嗯,有两件事。首先,AJAX请求通常是通过JavaScript进行的... AJAX代表异步JavaScript和XML(尽管XML已被JSON取代,但没有人将名称更改为AJAJ :-)。 AJAX是由您的浏览器向服务器发出的HTTP请求。所以,第二件事是,您不需要使用AJAX请求来获取HTML5中的地理位置数据,您需要使用JavaScript从浏览器中询问 navigation.geolocation 属性。否则,一切都如我之前所描述的那样。 - Tom Harrison
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接