2009年8月26日水曜日

[Rails][CodeReading] Rails::Initializer (18) initialize_time_zone

Initializer.process で18番目に呼ばれる initialize_time_zone メソッド。

def initialize_time_zone
if configuration.time_zone
zone_default = Time.__send__(:get_zone, configuration.time_zone)

unless zone_default
raise \
'Value assigned to config.time_zone not recognized.' +
'Run "rake -D time" for a list of tasks for finding appropriate time zone names.'
end

Time.zone_default = zone_default

if configuration.frameworks.include?(:active_record)
ActiveRecord::Base.time_zone_aware_attributes = true
ActiveRecord::Base.default_timezone = :utc
end
end
end

タイムゾーンを設定しています。Time.__send__ というメソッドは、Rails で拡張されたメソッドで、ActiveSupport::TimeZoneオブジェクトを返します。

>> Time.__send__(:get_zone,'UTC')
=> #<ActiveSupport::TimeZone:0x8506f60 @name="UTC", @utc_offset=0, @tzinfo=nil>
>>


Configuration.time_zone にデフォルト値はありませんが、config/environment.rb で
config.time_zone = 'UTC'
という記述があります。console から Time.zone_default を参照すると
>> Time.zone_default
=> #<ActiveSupport::TimeZone:0x84cf894 @name="UTC", @utc_offset=0, @tzinfo=nil>


TimeZoneにどんな種類があるのか、コードを見てみると

# activesupport-2.3.3/lib/active_support/values/time_zone.rb
MAPPING = {
"International Date Line West" => "Pacific/Midway",
"Midway Island" => "Pacific/Midway",
"Samoa" => "Pacific/Pago_Pago",
"Hawaii" => "Pacific/Honolulu",
"Alaska" => "America/Juneau",
"Pacific Time (US & Canada)" => "America/Los_Angeles",
"Tijuana" => "America/Tijuana",
"Mountain Time (US & Canada)" => "America/Denver",
"Arizona" => "America/Phoenix",
~~ 略 ~~
"Seoul" => "Asia/Seoul",
"Osaka" => "Asia/Tokyo",
"Sapporo" => "Asia/Tokyo",
"Tokyo" => "Asia/Tokyo",
~~ 略 ~~
"Auckland" => "Pacific/Auckland",
"Wellington" => "Pacific/Auckland",
"Nuku'alofa" => "Pacific/Tongatapu"
}.each { |name, zone| name.freeze; zone.freeze }
MAPPING.freeze

と、全部で142個定義されていました。
environment.rb を
config.time_zone = 'Tokyo'
と書き換えると(もちろん)Time.zone_defaultが変わります。
>> Time.zone_default
=> #<ActiveSupport::TimeZone:0x84fd730 @name="Tokyo", @utc_offset=32400, @tzinfo=nil>


[Rails][CodeReading] Railsの初期化コードを読む (イントロ&目次)

0 件のコメント:

コメントを投稿