7

下面的代碼確信,一個time_zone選擇是時間段內ActiveSupport::TimeZone.us_zonesvalidates_inclusion_of在Rails 4.1中不再起作用了嗎?

validates_inclusion_of :time_zone, in: ActiveSupport::TimeZone.zones_map(&:name) 

對Rails 4.0偉大的工作。剛剛升級到Rails 4.1,我在索引頁面出現這個錯誤(所以只是查看模型):

對象的方法#include?或一個PROC,λ-或符號需要 ,並且必須爲提供:在(或:內) 配置散列

我從猜測的選項,ActiveSupport::TimeZone.zones_map(&:name)不再是有效的值爲in屬性?

回答

22

嘗試添加.keys

validates :time_zone, 
    inclusion: { 
    in: ActiveSupport::TimeZone.zones_map.keys 
    } 
+1

有道理,我認爲它的工作...我得到了很多其他錯誤的,現在太:(看起來像我要去在rails上等待4.1 ... –

+8

塊參數'&:name'與4.1的實現無關,zones_map返回一個ThreadSafe :: Cache對象,它不是一個散列,它不支持#include ?方法來確定密鑰是否存在 4.1中的ActiveSupport :: TimeZone.zones_map.keys'就足夠了。 –

1

如果你想使用validates_inclusion_of這個工程,以及保持:

validates_inclusion_of :time_zone, 
    :in => ActiveSupport::TimeZone.zones_map(&:name).keys, 
    :message => "is not a valid time zone" 
2

Rails的5ActiveSupport::TimeZone.zones_map是一個私有方法。因此,如果你希望你的驗證工作,我建議的語法如下:。

validates :time_zone, inclusion: { in: ActiveSupport::TimeZone.all.map(&:name) } 
相關問題