我有这个代码让用户选择他们的时区。
<%= 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>我怎么能做到这一点?
发布于 2014-08-08 09:20:17
有什么特别的原因需要存储偏移量吗?我建议简化如下:
保持相同的视图
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视图
options_for_select(timezone_options, @corp.timezone)但是,您从priority中失去了time_zone_options_for_select选项。所以,正如你所看到的,最好还是坚持惯例。
https://stackoverflow.com/questions/25199736
复制相似问题