使用time_zone_select保存整数

时间:2012-12-04 18:51:26

标签: ruby-on-rails ruby ruby-on-rails-3 timezone railscasts

我正在按照此处找到的时区跟踪广播 - http://railscasts.com/episodes/106-time-zones-revised

以下是我用于时区选择输入的内容。目前,表单在数据库中保存字符串值(即“阿拉斯加”)。相反,我想将UTC偏移量保存为整数。我该怎么做呢?

<%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones

1 个答案:

答案 0 :(得分:0)

您有两个选项,您可以使用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控制台或您希望设置它的任何地方设置。