设置时区会破坏设计身份验证

Setting a Time-Zone breaks Devise Authenthication

我正在使用 with 和 devise-token-auth。

我在我的用户模型中做了这个并且工作正常:

before_create :skip_confirmation!

# Include default devise modules.
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable

我能够创建帐户,并得到自动确认。 对于其他内容,我需要通过将以下内容添加到我的 application.rb.

来更改应用程序的时区
config.time_zone = 'Europe/Berlin'
config.active_record.default_timezone = 'Europe/Berlin'

时区的东西也能正常工作,但由于未知原因,创建用户停止了。如果我创建一个并尝试登录,则会出现此错误:

A confirmation email was sent to your account at '...'. You must follow the instructions in the email before your account can be activated

在使用新时区创建帐户后,在我的数据库中正确插入了用户记录的每个时间戳值(使用新时区)。

我该如何解决这个问题?

我相信出于某种原因,Devise 用于设置 users table 上的 confirmed_at 字段的时区领先于 'Europe/Berlin' 时区。因此,当 Devise 检查 confirmed_at 是否设置为当前 date/time 之前的 date/time 时,它 returns 为假。

解决方案:尝试重新启动您的服务器以查看是否更新它。

更新

我查看了 Devise::Models 并看到了以下代码:

  def skip_confirmation!
    self.confirmed_at = Time.now.utc
  end

  def confirmed?
    !!confirmed_at
  end

这基本上让我相信最好以 UTC 设置应用程序时间,然后使用 Gem 转换它们,例如 Local Time