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使用的正确值。