2014-06-25 29 views
0

我想過濾並只返回來自特定國家的時區。如何在Ruby on Rails中按國家過濾time_zone?

在現在,我嘗試沒有成功:

# 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>] 

它將在驗證失敗,因爲不同的時區類型的,那麼我想這個轉換How to convert TZInfo to Rails Timezone但這並不工作過,目前在分歧映射矢量。

回答

1

如果您選擇值爲「(GMT-05:00)東部時間(美國&加拿大)」的選項,則此字符串將傳遞到模型進行驗證。你的validates_inclusion_of將運行Enum的.include?方法在你傳遞的集合上:in。

Timezone和Time.zone都沒有擴展Enum到我的知識中,所以它們不會返回一個Enum實例.include?將返回true/false。

如果您選擇包括的Act​​iveSupport :: TimeZone.us_zones的,這是什麼,你應該檢查對

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

但作爲的ActiveSupport :: TimeZone.us_zones包含驗證程序不返回字符串,單程你可以得到一個用於比較的通用類型,就是將上面的Enum的內容轉換爲字符串。

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

這樣,選擇的值,如「(GMT-05:00)東部時間(美國&加拿大)」應該評估正確,因爲在控制檯下面確實沒有麻煩。

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