如何在Rails 3中存储和处理网站用户的地理位置(经度和纬度),以便在每个页面请求时检查我们是否已经在该用户的会话中持有这些详细信息(如果我们没有持有这些详细信息,则应从浏览器请求用户位置,然后将这些详细信息存储在会话中)?
如何在Rails 3中存储和处理网站用户的地理位置(经度和纬度),以便在每个页面请求时检查我们是否已经在该用户的会话中持有这些详细信息(如果我们没有持有这些详细信息,则应从浏览器请求用户位置,然后将这些详细信息存储在会话中)?
根据你的需求,我会说你实际上不需要使用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。这是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<script>
标签。您可以像在HTML的其他部分中使用ERB标记一样,在脚本代码中引用控制器中设置的变量。或者,如果您不想显示任何内容,只需要数据,则可以从Ruby代码中调用Google Maps Web服务API:https://developers.google.com/maps/documentation/webservices/ - Tom Harrisonnavigation.geolocation
属性。否则,一切都如我之前所描述的那样。 - Tom Harrison