存储HTML5地理位置数据

Ell*_*iot 11 ajax html5 ruby-on-rails geolocation ruby-on-rails-3

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

Chr*_*ley 25

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

在你的控制器中

def action
  @lat_lng = cookies[:lat_lng].split("|")
end
Run Code Online (Sandbox Code Playgroud)

在你看来

<%- unless @lat_lng %>
<script>
  getGeoLocation();
</script>
<%- end %>
Run Code Online (Sandbox Code Playgroud)

在你的一个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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,以上测试中没有一个用于查看用户是否具有支持地理定位的浏览器,或者用户是否已授予(或拒绝)使用其位置的权限,并且该cookie将是会话cookie,并且JS不会不要测试cookie是否已设置.要在cookie上设置更复杂的信息,请查看http://www.quirksmode.org/js/cookies.html有关使用javascript进行GeoLocation的更多信息,请参阅http://diveintohtml5.info/geolocation.html


Tom*_*son 5

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

def lat_lng
  @lat_lng ||= session[:lat_lng] ||= get_geolocation_data_the_hard_way
end
Run Code Online (Sandbox Code Playgroud)

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

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