Ruby 1.8.7 で実行されている Rails 3.2.6 アプリを持っています。このアプリは、タイム ゾーンとして中央ヨーロッパ時間 (つまり、UTC+2) を使用するように構成されています。イニシャライザでは、モンキー パッチTime
とDateTime
いくつかのカスタム機能を使用しています。
奇妙なことに、モンキー パッチを適用したメソッドでは、Time/DateTime インスタンスが UTC であるかのように動作しますが (ただし、タイム ゾーンで調整された値を使用します)、アプリの他の場所ではタイム ゾーンの構成が尊重されます。
したがって、例として、config/initializers/monkey_patching.rb
次のようなものがあります
module MonkeyPatching
def foo
inspect
end
end
class Time
include MonkeyPatching
end
class DateTime
include MonkeyPatching
end
さて、アプリ (または Rails コンソール) の他の場所で、これが私が得たものです
model.created_at.inspect #=> "Mon, 24 Sep 2012 15:06:34 CEST +02:00" (correct!)
model.created_at.foo #=> "Mon Sep 24 15:06:34 UTC 2012" (all wrong!)
したがって、inspect
「直接」を呼び出すとmodel.created_at
、タイムゾーンが調整された正しい結果が得られます。しかし、パッチが適用されたメソッドfoo
を呼び出します-これも単に ! を呼び出しinspect
ます - UTC ではないにもかかわらず、時間を UTC として扱います。
混乱を招くことに、これはモデル属性でのみ発生します。つまり、Rails コンソールでは、 とDateTime.now.inspect
に対して同一の正しい結果が得られDateTime.now.foo
ます。しかし、DateTime 属性に対して同じことを行うと、上記の奇妙な動作が発生します。
なぜこれが起こるのか(そしてそれを修正する方法)はありますか?