我正在关注时区的 railscast - http://railscasts.com/episodes/106-time-zones-revised
以下是我用于时区选择输入的内容。目前,表单在数据库中保存一个字符串值(即“阿拉斯加”)。相反,我想将 UTC 偏移量保存为整数。我该怎么做呢?
<%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones
我正在关注时区的 railscast - 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 控制台或您希望设置的任何地方。