Хранение данных геолокации HTML5 - PullRequest
11 голосов
/ 18 марта 2012

Как я могу сохранить и обработать геолокацию (long и lat) пользователя веб-сайта в Rails 3, чтобы он проверял, сохраняем ли мы эту информацию в сеансе для этого пользователя при каждом запросе страницы (еслимы не храним детали, тогда мы должны запросить местоположение пользователя из браузера и затем сохранить эти данные в сеансе)?

Ответы [ 2 ]

25 голосов
/ 30 марта 2012

Исходя из ваших требований, я бы сказал, что вам на самом деле не нужен 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. Чтобы установить более сложную информацию о куки, посмотрите на http://www.quirksmode.org/js/cookies.html Для получения дополнительной информации о геолокации с использованием javascript см. http://diveintohtml5.info/geolocation.html

5 голосов
/ 18 марта 2012

Это очень распространенный шаблон в Rails.В application_controller.rb или application_helper.rb (если вы хотите, чтобы он был доступен с нескольких контроллеров), определите метод, например

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

Бит ||= читает «если часть слева равна нулю, проверьте детальсправа, а затем присвойте значение части слева в следующий раз ".

* * * * * * * * * * * * * * * * * * * * * * * Здесь переменная экземпляра ... вероятно, избыточна для этого случая, так как я сомневаюсь в получении данных сеансаэто любая реальная работа, но так как браузер будет запрашивать разрешение, вы действительно хотите сделать это только один раз.И, возможно, в браузере нет браузера, учитывающего местоположение, поэтому вам нужно обратиться к чему-то другому, поэтому вызовите метод get_geolocation_data_the_hard_way, который вам придется написать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...