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.