Rails 3:将时区设置为当前用户时区

我把它放在Application Controller中:

before_filter :set_timezone def set_timezone Time.zone = current_user.time_zone end 

但我总是得到错误:

 undefined method time_zone for # 

而我只是不知道为什么……

我希望有人能帮帮忙

Max – 您提到的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的原因 – 你还没有将time_zone存储在用户身上。

继Jesse的回答之后,我应该补充一点,您通常可以避免在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 
 function set_time_zone_offset() { var current_time = new Date(); $.cookie('time_zone', current_time.getTimezoneOffset()); } 

这是不正确的,因为时间偏移不是常数,它取决于夏令时。 Rails在调用ActiveSupport :: TimeZone [-min.minutes]时需要标准时间偏移量。

例如:在法国日期09/03/2013 10:50:12 +02:00,你的javascript将返回-120作为偏移,其中ActiveSupport将需要-60来解析法国时区。

然后你需要检查这是否是JS中的夏令时,如果是这种情况,你必须将一小时减去偏移量以获得Rails使用的正确值。