最近我尝试设置一个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}
如果我从现在开始只设置为1天,则过期日期恰好设置为从现在开始的24小时。
为什么begin_of_date没有正确设置日期?
提前致谢
答案 0 :(得分: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}