Хранение данных геолокации HTML5

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

Ответ 1

В соответствии с вашими требованиями я бы сказал, что вам действительно не нужен 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. Для получения дополнительной информации о GeoLocation с помощью javascript см. http://diveintohtml5.info/geolocation.html

Ответ 2

Это очень распространенный шаблон в 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, который вам нужно будет написать.