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

Max*_*Max 8 timezone ruby-on-rails

我把它放在Application Controller中:

before_filter :set_timezone 

def set_timezone  
Time.zone = current_user.time_zone 
end  
Run Code Online (Sandbox Code Playgroud)

但我总是得到错误:

undefined method time_zone for #<User:0xa46e358>
Run Code Online (Sandbox Code Playgroud)

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

我希望有人能帮帮忙

yak*_*aka 26

继Jesse的回答之后,我应该补充一点,你通常可以避免在db中添加一个新列,只需在用户模型中创建一个自定义方法,并利用cookie来获取用户的时区:

在客户端(js):

function set_time_zone_offset() {
    var current_time = new Date();
    $.cookie('time_zone', current_time.getTimezoneOffset());
}
Run Code Online (Sandbox Code Playgroud)


在应用控制器中:

before_filter :set_timezone 

def set_timezone  
 min = request.cookies["time_zone"].to_i
 Time.zone = ActiveSupport::TimeZone[-min.minutes]
end 
Run Code Online (Sandbox Code Playgroud)

  • +1,用于尝试根据可用信息确定时区,而无需用户明确提供.不过,这是一种相当不可靠的方法.在生产环境中,您可能希望使用[像这样](https://bitbucket.org/pellepim/jstimezonedetect/src/ab0cfa941246/detect_timezone.js)来更准确地检测时区,并且您应该始终存储并允许用户覆盖它. (10认同)

Jes*_*ott 13

马克斯-在ryandaigle.com文章你提到的链接,这个书面记录,你需要创建一个迁移添加"的time_zone"作为对用户的属性

(这是来自文章,在rails 2.x语法中)

$ script/generate scaffold User name:string time_zone:string
$ rake db:migrate
Run Code Online (Sandbox Code Playgroud)

后来

<%= f.time_zone_select :time_zone, TimeZone.us_zones %>
Run Code Online (Sandbox Code Playgroud)

这就是你的.time_zone返回method_missing的原因 - 你还没有将time_zone存储在用户身上.