2012-10-31 49 views
2

最近我試圖設置一個cookie來驗證Rails 3.2應用程序中的會話。Rails錯誤到期日期的cookies

該Cookie應該在第二天的開始到期,這樣我會迫使用戶重新登錄(強制)

首先,我改變了我的應用程序的時區到一個我期待處理:

config.time_zone = 'Caracas' 

之後,我創建了餅乾如下:

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小時內從現在。

任何想法爲什麼beginning_of_date沒有正確設置日期?

在此先感謝

回答

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} 
+0

非常感謝mccannf。如果我在in_time_zone方法中明確指出'Caracas',它就可以工作。我想知道爲什麼,因爲我在application.rb中將我的時區設置爲加拉加斯,那麼爲什麼在創建cookie的助手方法中未識別時區的任何想法? – omrsin

+0

你可能在多個環境中有'config.time_zone'嗎?當您在自己的環境中的'rails console'中運行上面的命令時會發生什麼? – mccannf

+0

如果我在控制檯中執行Time.zone說'加拉加斯'。到目前爲止,我正在測試我的開發環境中的一切。 – omrsin