【问题标题】:Time.zone setting in controller only仅控制器中的时区设置
【发布时间】:2018-05-22 19:22:08
【问题描述】:

我有一个 Rails 应用程序,我在控制器的 before 操作中为每个请求设置时区,如下所示:

Time.zone="Central Time (US & Canada")

我可以用

打印时区
puts Time.zone

这是打印出来的。

(GMT-06:00) Central Time (US & Canada)

在我调用模型中的方法之前,所有这些都可以正常工作。当我这样做时,时区会丢失,我必须在我的模型中再次设置Time.zone

如果我在我的模型中调用下面的方法,它会从我的控制器打印 UTC 时间。

型号

def self.import_file(file)
    puts Time.zone
    # this prints out UTC time. 
end

这是预期的行为还是我遗漏了什么?

【问题讨论】:

  • 当您说您在控制器中设置时区时,这是否取决于谁登录?或者这应该是整个 Rails 应用程序的全局配置?对于前者,您需要将时区作为参数传递给模型方法;模型不知道“当前用户”。在后者的情况下,这段代码一开始就不属于控制器!您应该在config/application.rb 中设置全球时区。

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

Time.zone 设置为线程变量。如果您在不同的线程中(即后台工作者、进程、irb),Time.zone 将是您的应用程序的默认值(通常设置在config/application.rb)。

如果您不在其他线程/进程中,请确保您没有意外调用 Time.zone = nil。您还应该在 http://api.rubyonrails.org/classes/Time.html#method-c-use_zone 上查看 Rails 明确的 Time.use_zone 示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多