如何在Ruby on Rails中按国家/地区过滤time_zone?

时间:2014-06-25 17:21:04

标签: ruby-on-rails ruby ruby-on-rails-4 activesupport

我正在尝试过滤并仅返回特定国家/地区的时区。

现在,我尝试了没有成功:

# wrong code - i used Brazil only for tests.

validates_inclusion_of :time_zone, in: ActiveSupport::TimeZone.zones_map(&:name)    
= f.input :time_zone, collection: TZInfo::Timezone.all.find_all{ |z| z.name =~ /Brazil/ }

# Return: [#<TZInfo::TimezoneProxy: Brazil/Acre>, #<TZInfo::TimezoneProxy: Brazil/DeNoronha>, #<TZInfo::TimezoneProxy: Brazil/East>, #<TZInfo::TimezoneProxy: Brazil/West>]

验证失败,因为TimeZone类型的差异,然后我尝试了这种转换How to convert TZInfo to Rails Timezone,但这也不起作用,MAPPING向量存在差异。

1 个答案:

答案 0 :(得分:1)

如果您选择值为&#34;(GMT-05:00)东部时间(美国和加拿大)&#34;此字符串将传递给模型进行验证。你的validates_inclusion_of将运行Enum的.include?你传递的集合的方法:in。

Timezone和Time.zone都没有将Enum扩展到我所知的位置,所以他们不会返回一个枚举的实例.include?将返回true / false。

如果您的选择包含ActiveSupport :: TimeZone.us_zones,那么您应该检查包含验证器

validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones

但是由于ActiveSupport :: TimeZone.us_zones没有返回字符串,因此可以通过一种方式获得用于比较的公共类型,将上述枚举的内容转换为字符串。

validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones.map(&:to_s)

这样,选择的值如&#34;(GMT-05:00)东部时间(美国和加拿大)&#34;应评估为true,如下所示在控制台中没有问题。

> ActiveSupport::TimeZone.us_zones.map(&:to_s).include?("(GMT-05:00) Eastern Time (US & Canada)")
=> true