Rails 3: Установка часового пояса для текущего часового пояса пользователей

я помещаю это в контроллер приложения:

before_filter :set_timezone 

def set_timezone  
Time.zone = current_user.time_zone 
end  

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

undefined method time_zone for #<User:0xa46e358>

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

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

3 ответов


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

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

$ 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 -- вы еще не сохранили time_zone на пользователе.


далее к ответу Джесси, я должен добавить, что вы можете вообще избежать добавления нового столбца в БД и просто создать пользовательский метод в модели пользователя и используйте 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 

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

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

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

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