在Rails 4.1中,validates_inclusion_of不再一样吗?

时间:2014-04-09 00:10:53

标签: ruby-on-rails ruby ruby-on-rails-4 activesupport ruby-on-rails-4.1

以下代码确保time_zone选择的内容位于ActiveSupport::TimeZone.us_zones的时区内:

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

在Rails 4.0中工作得很好。刚升级到Rails 4.1,我在索引页面上收到此错误(所以只需查看模型):

  

使用#include方法的对象?或者是proc,lambda或者符号   必需的,并且必须作为:in(或:within)选项提供   配置哈希

我猜测,ActiveSupport::TimeZone.zones_map(&:name)不再是in属性的有效值?

3 个答案:

答案 0 :(得分:22)

尝试添加.keys

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

答案 1 :(得分:2)

Rails 5 中,ActiveSupport::TimeZone.zones_map是一种私有方法。因此,如果您希望验证有效,我建议使用以下语法:

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

答案 2 :(得分:1)

如果您想继续使用validates_inclusion_of,这也有效:

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