2

Ruby 1.8.7 で実行されている Rails 3.2.6 アプリを持っています。このアプリは、タイム ゾーンとして中央ヨーロッパ時間 (つまり、UTC+2) を使用するように構成されています。イニシャライザでは、モンキー パッチTimeDateTimeいくつかのカスタム機能を使用しています。

奇妙なことに、モンキー パッチを適用したメソッドでは、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 属性に対して同じことを行うと、上記の奇妙な動作が発生します。

なぜこれが起こるのか(そしてそれを修正する方法)はありますか?

4

1 に答える 1

1

RailsはActiveSupport::TimeWithZone、通常のRubyではなく、時間属性に使用しますTime。パッチActiveSupport::TimeWithZoneも当ててみてください。

class ActiveSupport::TimeWithZone
  include MonkeyPatching
end
于 2012-09-24T15:45:14.937 に答える