我正在遵循此处找到的时区的轨道广播 - http://railscasts.com/episodes/106-time-zones-revised
以下是我用于时区选择输入的内容。 目前,表单在数据库中保存一个字符串值(即。"阿拉斯加")。 相反,我想将 UTC 偏移量保存为整数。 我将如何做到这一点?
<%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones
您有两个选项,可以使用 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_name 而不是 :time_zone,然后按如下所示更新模型:
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 控制台或您希望设置时区的任何地方设置时区。