【问题标题】:validates_inclusion_of no longer working the same in Rails 4.1?validates_inclusion_of 在 Rails 4.1 中不再工作?
【发布时间】:2014-04-09 00:10:52
【问题描述】:

以下代码确保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 属性的有效值?

【问题讨论】:

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


    【解决方案1】:

    尝试添加.keys

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

    【讨论】:

    • 有道理,我认为它有效......我现在也遇到了很多其他错误:(。看起来我要在 Rails 4.1 上等待......
    • block 参数 &:name 与 4.1 实现无关。 zone_map 返回一个 ThreadSafe::Cache 对象,它不是一个散列。它不支持#include?方法作为确定密钥是否存在的方法。 ActiveSupport::TimeZone.zones_map.keys 在 4.1 中就足够了。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果您想继续使用validates_inclusion_of,这也可以:

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

      【讨论】:

        猜你喜欢
        • 2016-04-13
        • 1970-01-01
        • 2014-05-23
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        • 2018-11-26
        相关资源
        最近更新 更多