Rails 3: установка часового пояса на текущий часовой пояс пользователя - PullRequest
8 голосов
/ 24 ноября 2010

Я помещаю это в Application Controller:

before_filter :set_timezone 

def set_timezone  
Time.zone = current_user.time_zone 
end  

Но я всегда получаю ошибку:

undefined method time_zone for #<User:0xa46e358>

, и я просто не знаю почему ...

Я надеюсь, что кто-то может помочь

Ответы [ 3 ]

26 голосов
/ 09 мая 2011

В дополнение к ответу Джесси, я должен добавить, что вы вообще можете избежать добавления нового столбца в db и просто создать собственный метод в пользовательской модели и использовать cookie , чтобы получить часовой пояс пользователя:

на стороне клиента (js):

function set_time_zone_offset() {
    var current_time = new Date();
    $.cookie('time_zone', current_time.getTimezoneOffset());
}

в контроллере приложений:

before_filter :set_timezone 

def set_timezone  
 min = request.cookies["time_zone"].to_i
 Time.zone = ActiveSupport::TimeZone[-min.minutes]
end 
13 голосов
/ 24 ноября 2010

Макс - статья ryandaigle.com вы упомянули ссылки на эту запись , где вам нужно создать миграцию для добавления "time_zone" в качестве атрибута для пользователя

(это из статьи, в синтаксисе rails 2.x)

$ script/generate scaffold User name:string time_zone:string
$ rake db:migrate

позже

<%= f.time_zone_select :time_zone, TimeZone.us_zones %>

Вот почему ваша .time_zone возвращает method_missing - у вас нет 'Пользователь еще не сохранил временную зону.

2 голосов
/ 03 сентября 2013
function set_time_zone_offset() {
  var current_time = new Date();
  $.cookie('time_zone', current_time.getTimezoneOffset());
}

Это не правильно, поскольку смещение времени не является постоянным, оно зависит от периодов летнего времени. Rails ожидает стандартное смещение времени при вызове ActiveSupport :: TimeZone [-min.minutes] .

ex: во Франции на дату 09.03.2013 10:50:12 +02: 00 ваш javascript вернет -120 в качестве смещения, где ActiveSupport потребуется -60 для разрешения часового пояса Франции.

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

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