我有这个代码让用户选择他们的时区。
<%= time_zone_options_for_select(@corp.timezone, nil, ActiveSupport::TimeZone) %>
问题是代码产生了这个html
<option value="American Samoa">(GMT-11:00) American Samoa</option>
我需要它像下面这样
<option value="-11:00">(GMT-11:00) American Samoa</option>
我怎么才能做到呢?
有什么特殊的原因需要存储偏移量吗?我建议这样简化:
keep view the same
time_zone_options_for_select(@corp.timezone, nil, ActiveSupport::TimeZone)
模型validates :timezone, inclusion: { in: ActiveSupport::TimeZone.zones_map.keys }
转换DateTime.now.in_time_zone(@corp.timezone)
DateTime.now.in_time_zone("Hawaii")
# => Thu, 07 Aug 2014 23:19:03 HST -10:00
然而,为了回答你的问题。请参阅time_zone_options_for_select
的文档和源代码。
最后一个参数接受一个模型。本例中是ActiveSupport::TimeZone
。然后使用model.all
获取时区列表,并分别提取标签、值作为[instance.to_s, instance.name]
。
注意,每个TimeZone
实例都有utc_offset
实例。
TimeZone.new("Hawaii").utc_offset
# => -36000
这意味着你可以传递给time_zone_options_for_select
你自己的实现self.all
和补丁instance.name
的自定义类。
你也可以跳过time_zone_options_for_select
而使用options_for_select
,传入这个自定义数组:
def timezone_options
ActiveSupport::TimeZone.all.map do |zone|
[zone.to_s, timezone_to_offset_string(zone)]
end
end
def timezone_to_offset_string(timezone)
(timezone.utc_offset / 3600).to_s + ":00"
end
<<h3>视图/h3>options_for_select(timezone_options, @corp.timezone)
但是你从time_zone_options_for_select
中失去了priority
选项。所以,正如你所看到的,最好还是遵循约定。