2

最近、Rails 3.2 アプリでセッションを検証するために Cookie を設定しようとしました。

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 が日付を正しく設定していない理由はありますか?

前もって感謝します

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 に答える