Подтвердить что ты не робот

Rails: как получить текущий часовой пояс пользователя при использовании Heroku

Я установил часовой пояс нашего сайта на Heroku в стандартное тихоокеанское время (PST), используя:

heroku config:add TZ=America/Los_Angeles

Время для пользователей теперь всегда находится в PST - независимо от того, находятся ли они в часовом поясе PST.

Какой лучший способ получить фактический часовой пояс пользователя (т.е. часовой пояс, где они физически расположены)?

Я предполагаю, что это можно решить с помощью Rails (или Javascript?), в отличие от Heroku.

4b9b3361

Ответ 1

Есть два способа сделать это.

  • Действительно, вы можете использовать javascript для извлечения их текущего времени/часового пояса. Существует вероятность того, что время компьютера пользователя установлено неправильно, и в этом случае отображаемый часовой пояс будет неправильным.

    Поскольку вы используете Rails, рекомендуется использовать javascript, уже связанный как драгоценный камень, например detect_timezone_rails. Это упрощает установку (потому что все это автоматически связано в конвейере активов.

  • Вы можете использовать IP-адрес для вывода своего страны и часового пояса. Опасность в этом случае заключается в том, что пользователь может использовать прокси. Кроме того, хотя IP-адрес обычно имеет разрешение на уровне города, он может быть более или менее точным, что в редких случаях может привести к неправильному часовому поясу.

    Используя IP-адрес, вы можете получить приблизительный город и широту/долготу. Есть много драгоценных камней, которые могут сделать это на Ruby Toolbox, например. geocoder. С широтой/долготой вы можете получить часовой пояс, используя драгоценный камень, например timezone.

Вы также можете использовать одно из указанных выше и разрешить пользователю вручную изменять свой часовой пояс на своем веб-сайте (либо сохранить этот параметр в базе данных, если зарегистрирован, либо как файл cookie в своем браузере). Это полезно, если у вас неправильный часовой пояс.

Ответ 2

Существует несколько способов сделать это в зависимости от того, как настроено приложение. Ни один из них не уникален для окружающей среды Heroku.

Если ваше приложение позволяет пользователям регистрироваться, вы, скорее всего, имеете модель User, и вы можете использовать камень Devise для аутентификации/регистрации. Добавьте поле в свой db (: time_zone) и сохраните часовой пояс пользователей в этом поле при их регистрации.

>> rails generate migration add_time_zone_to_users time_zone:string
>> rake db:migrate

Rails предоставляет удобный помощник формы time_zone_select, который дает вам список выбора со всеми часовыми поясами в нем, которые вы можете отобразить для своего пользователя. Добавьте его в форму регистрации пользователя и разрешите пользователю устанавливать свой часовой пояс при регистрации. http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/time_zone_select

В вашем контроллере приложений вы можете сделать что-то вроде этого:

before_filter :set_time_zone

def set_time_zone
    #current user is a devise method see https://github.com/plataformatec/devise
    Time.zone = current_user.time_zone if current_user
end

Затем, когда вы показываете дату в своем приложении, вызов .in_time_zone в экземпляре времени, который отображает время в часовом поясе пользователей.

<%= Time.now.in_time_zone %> or <%= @your_model.created_at.in_time_zone %> 

Если у вас нет аутентификации пользователя, вы можете вернуться к javascript. Для этого вы можете использовать собственный javascript getTimezoneOffset() для объекта даты или даже лучше использовать следующий плагин jsTimezoneDetect:

http://www.pageloom.com/automatic-timezone-detection-with-javascript

Наконец, вы можете использовать гибрид обоих и сначала определить их смещение часового пояса с помощью javascript, а затем сохранить это значение в сеансе /cookie rails, а затем использовать before_filter для установки Time.zone, как указано выше, но на основе сеанса time_zone значение, ранее вычисленное в javascript.