2つのオプションがあり、selectを使用するか、仮想属性を作成することができます。私はおそらく後者のオプションを好むでしょう。
TimeZoneは時間単位のオフセット(秒単位または文字列のみ)を直接提供しないため、collection_selectを直接使用することはできませんが、次のようにselectを使用できます(utc_offsetは秒単位です)。
f.select :time_zone, ActiveSupport::TimeZone.us_zones.map { |z| [z.name, z.utc_offset / 1.hour] }
仮想属性を使用する場合は、すでに使用しているコードを使用しますが、:time_zoneの代わりに:time_zone_nameを使用してから、次のようにモデルを更新します。
def time_zone_name=(value)
time_zone = ActiveSupport::TimeZone.new(value).utc_offset / 1.hour
end
def time_zone_name
# time_zone is a number like -9
ActiveSupport::TimeZone.new(time_zone).name
end
最後のオプションを使用すると、Railsコンソールから、または設定したい場所からでも、オフセットまたは名前でタイムゾーンを設定できるため、私は最後のオプションを好みます。