Ruby on rails 如何在RubyonRails中按国家过滤时区?
我试图过滤并只返回特定国家的时区 现在,我尝试了以下方法,但没有成功:Ruby on rails 如何在RubyonRails中按国家过滤时区?,ruby-on-rails,ruby,ruby-on-rails-4,activesupport,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 =~
# 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>]
#错误的代码-我只在测试中使用了巴西。
在:ActiveSupport::TimeZone.zones\u映射(&:name)中验证:时区的包含
=f.input:time_zone,collection:TZInfo::Timezone.all.find_all{z | z.name=~/Brazil/}
#Return:[#、#、#、#、#]
它将在验证时失败,因为时区类型不同,然后我尝试了此转换,但这也不起作用,映射向量存在差异。如果选择值为“(GMT-05:00)东部时间(美国和加拿大)”的选项,此字符串将传递给模型进行验证。您的validates_inclusion_将运行枚举。是否包括?方法传递给的集合:in 据我所知,Timezone和Time.zone都没有扩展Enum,因此它们不会返回包含的Enum实例?将为返回true/false 如果您的选择由ActiveSupport::TimeZone.us\u区域组成,那么您应该根据这些区域检查包含验证器
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)
这样,选择的值(如“(GMT-05:00)东部时间(美国和加拿大)”应计算为true,如下所示,在console中不会出现问题
> ActiveSupport::TimeZone.us_zones.map(&:to_s).include?("(GMT-05:00) Eastern Time (US & Canada)")
=> true