2

最近我试图设置一个 cookie 以验证 Rails 3.2 应用程序中的会话。

cookie 应该在第二天开始时过期,这样我会强制用户再次登录(强制)

首先,我将应用程序的时区更改为我期望处理的时区:

config.time_zone = 'Caracas'

之后,我按如下方式创建了 cookie:

cookies[:remember_token] = {value: user.remember_token, 
                            expires: 1.day.from_now.beginning_of_day}

cookie 的创建没有任何问题,但过期日期错误。在 Chromium 中,日期设置为今天晚上 19​​:30(尽管我的机器时区是根据应用程序设置的)。

当我将 cookie 的定义更改为:

cookies[:remember_token] = {value: user.remember_token, 
                            expires: 1.day.from_now}

如果我仅将 cookie 设置为从今天起 1 天,那么过期日期将正确设置为从现在起正好 24 小时。

任何想法为什么 begin_of_date 没有正确设置日期?

提前致谢

4

1 回答 1

3

这取决于执行的顺序。计算一天的开始后应用时区。例如,我在 UTC 时区,我可以在以下时间执行以下操作rails console

irb(main):019:0> 1.day.from_now.in_time_zone(Time.zone).beginning_of_day
=> Thu, 01 Nov 2012 00:00:00 UTC +00:00
irb(main):020:0> 1.day.from_now.beginning_of_day.in_time_zone(Time.zone)
=> Thu, 01 Nov 2012 00:00:00 UTC +00:00
irb(main):021:0> Time.zone.now.tomorrow.beginning_of_day 
=> Thu, 01 Nov 2012 00:00:00 UTC +00:00
irb(main):022:0> 1.day.from_now.beginning_of_day.in_time_zone('Caracas')
=> Wed, 31 Oct 2012 19:30:00 VET -04:30
irb(main):023:0> 1.day.from_now.in_time_zone('Caracas').beginning_of_day
=> Thu, 01 Nov 2012 00:00:00 VET -04:30

因此,如果您将 cookie 计算更改为以下内容,它应该可以工作:

cookies[:remember_token] = {value: user.remember_token, 
                            expires: 1.day.from_now.in_time_zone(Time.zone).beginning_of_day}
于 2012-10-31T19:42:10.923 回答