Rails time_zone_select 使用“官方”时区值

Don*_*nMB 5 javascript ruby-on-rails

我的观点(哈姆勒):

= f.time_zone_select :time_zone, nil, {}, class: 'form-control'
Run Code Online (Sandbox Code Playgroud)

呈现为:

...
<option value="Ljubljana">(GMT+01:00) Ljubljana</option>
<option value="Madrid">(GMT+01:00) Madrid</option>
<option value="Paris">(GMT+01:00) Paris</option>
<option value="Prague">(GMT+01:00) Prague</option>
...
Run Code Online (Sandbox Code Playgroud)

创建记录时,我想将该:time_zone属性设置为用户的当前时区。有几种方法可以做到这一点,但经过研究,我发现最常见的是 gemtimezone_local或 JS 库jstz。无论哪种方式,所有这些开源库似乎都使用与 rails 不同的模式,例如巴黎时区定义为:

欧洲/巴黎

但是,Rails 中的 TimeZone 对象使用

巴黎

当我想用用户的当前时区创建记录时,这会导致不一致,因为它不匹配。我需要 rails 使用相同的模式,jstz反之亦然,但我不想在gsub这里或类似的地方使用字符串。这里最好的方法是什么?

Jer*_*rph 3

可以使用Draper修改alland name(使用的list和value方法time_zone_select):

class TimeZoneDecorator < Draper::Decorator
  decorates ActiveSupport::TimeZone
  delegate_all

  def self.all
    TimeZoneDecorator.decorate_collection(ActiveSupport::TimeZone.all)
  end

  def self.us_zones
    TimeZoneDecorator.decorate_collection(ActiveSupport::TimeZone.us_zones)
  end

  # other custom collection methods

  def name
    tzinfo.name # "Europe/Paris" instead of "Paris"
  end
end
Run Code Online (Sandbox Code Playgroud)

然后使用model标签中的选项:

= f.time_zone_select :timezone, TimeZoneDecorator.us_zones, {include_blank: "Set from Lat/Lng", model: TimeZoneDecorator}, {class: 'form-control'}
Run Code Online (Sandbox Code Playgroud)