存储HTML5地理位置数据

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

根据你的要求我会说你实际上并不需要ajax,因为大多数处理都是用JS完成的(要求用户访问他们的位置,解析响应等),我会用JS来设置一个cookie,然后Rails会看到)。

在你的控制器中

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

在你看来

 <%- unless @lat_lng %>  <%- 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进行GeoLocation的更多信息,请参阅http://diveintohtml5.info/geolocation.html

这是Rails中非常常见的模式。 在application_controller.rbapplication_helper.rb (如果您希望它可以从多个控制器访问)定义一个类似的方法

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

||=位读取“如果左侧的部分为零,请检查右侧的部分,然后将值分配给左侧的部分以供下次使用”。

@lat_lng这里是一个实例变量……对于这种情况可能@lat_lng过分,因为我怀疑会话数据是否是任何实际工作,但由于浏览器会请求权限,你真的只想这样做一次。 也许浏览器没有位置感知浏览器,所以你需要依赖其他东西,因此调用你必须编写的方法get_geolocation_data_the_hard_way