我正在尝试过滤并仅返回特定国家/地区的时区。
现在,我尝试了没有成功:
# 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向量存在差异。
答案 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