Установить текущий Time.zone в Rails? - PullRequest
14 голосов
/ 03 июня 2009

Javascript на моей странице сохраняет смещение UTC клиента в файл cookie. Как мне использовать этот файл cookie для создания TimeZone и присвоения его Time.zone?

Мне нужно что-то вроде:

before_filter :set_time_zone

def set_time_zone
  Time.zone = ActiveSupport::TimeZone.new('my timezone', cookies[:timezone])
end

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

Ответы [ 3 ]

15 голосов
/ 03 июня 2009

Вот рабочий гугл-ответ:

min = cookies[:timezone].to_i
Time.zone = ActiveSupport::TimeZone[-min.minutes]

Просто чтобы прояснить, часть javascript:

if(!($.cookie('timezone'))) {
  current_time = new Date();
  $.cookie('timezone', current_time.getTimezoneOffset(), { path: '/', expires: 10 } );
} 
6 голосов
/ 23 октября 2012

@ snitko - ваш ответ работал отлично для меня долгое время. Однако, как указал @Giovanni, он не учитывает переход на летнее время в некоторых сценариях, поскольку он вытягивает первый доступный часовой пояс с учетом минутного смещения. Я нашел простой рабочий ответ, который объясняет летнее время.

Отправляйтесь сюда - http://site.pageloom.com/automatic-timezone-detection-with-javascript, это детектор часовых поясов javascript. Вы просто копируете код javascript, связанный с веб-сайта (или прямо здесь ), в один из файлов javascript вашего приложения (application.js работает нормально). Это позволяет вам извлекать часовой пояс через объект с именем jstz.

Тогда в application.html.erb у меня есть

<script type="text/javascript">

  var timezone = jstz.determine();
  document.cookie = 'time_zone='+timezone.name()+';';

</script>

А в application_controller.rb у меня есть

before_filter :set_timezone 

private
def set_timezone
  Time.zone = cookies["time_zone"]
end

И это все, что вам нужно! Часовой пояс установлен правильно для вашего приложения Rails.

РЕДАКТИРОВАТЬ: Возможно, вам нужно поместить код настройки cookie javascript после тега <\body> в application.html.erb из-за различий в способе загрузки файлов javascript и порядка их размещения.

3 голосов
/ 03 июня 2009

Когда я храню его в моей модели пользователя, это так просто, как этот

def set_time_zone
  Time.zone = current_user.time_zone unless current_user.blank?
end

так что, возможно, вы могли бы сделать

def set_time_zone
  Time.zone = cookies[:timezone]
end

Это не проверено, я никогда не пытался сделать это из куки, я думаю, что имеет смысл хранить его в модели User.

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