validates_inclusion_of no longer working the same

2019-02-07 02:02发布

The following code made sure that a time_zone chose is within the time zones in ActiveSupport::TimeZone.us_zones:

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

Worked great in Rails 4.0. Just upgraded to Rails 4.1 and I'm getting this error on my index page (so just simply viewing the models):

An object with the method #include? or a proc, lambda or symbol is required, and must be supplied as the :in (or :within) option of the configuration hash

I'm guessing from that, ActiveSupport::TimeZone.zones_map(&:name) is no longer a valid value for the in property?

3条回答
SAY GOODBYE
2楼-- · 2019-02-07 02:19

In Rails 5, ActiveSupport::TimeZone.zones_map is a private method. Therefore, if you want your validation to work, I suggest the following syntax:

validates :time_zone, inclusion: { in: ActiveSupport::TimeZone.all.map(&:name) }
查看更多
一纸荒年 Trace。
3楼-- · 2019-02-07 02:22

try adding .keys ?

validates :time_zone, 
  inclusion: { 
    in: ActiveSupport::TimeZone.zones_map.keys 
  } 
查看更多
一纸荒年 Trace。
4楼-- · 2019-02-07 02:37

If you want to keep using validates_inclusion_of this works as well:

validates_inclusion_of :time_zone, 
   :in => ActiveSupport::TimeZone.zones_map(&:name).keys, 
   :message => "is not a valid time zone"
查看更多
登录 后发表回答