validates_inclusion_of больше не работает в 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, лямбда или символ, и они должны быть предоставлены как опция :in (или :within) хэша конфигурации

Я предполагаю, что ActiveSupport::TimeZone.zones_map(&:name) больше не является допустимым значением для свойства in?


person at.    schedule 09.04.2014    source источник


Ответы (3)


попробуйте добавить .keys ?

validates :time_zone, 
  inclusion: { 
    in: ActiveSupport::TimeZone.zones_map.keys 
  } 
person house9    schedule 09.04.2014
comment
Имеет смысл, я думаю, это сработало... Теперь я тоже получаю много других ошибок :(. Похоже, я собираюсь подождать на рельсах 4.1... - person at.; 09.04.2014
comment
Аргумент блока &:name не имеет отношения к реализации 4.1. zone_map возвращает объект ThreadSafe::Cache, который не совсем является хешем. Он не поддерживает #include? метод как способ определить, присутствует ли ключ. ActiveSupport::TimeZone.zones_map.keys достаточно в 4.1. - person Gary Wright; 28.05.2014

В Rails 5 ActiveSupport::TimeZone.zones_map является приватным методом. Поэтому, если вы хотите, чтобы ваша проверка работала, я предлагаю следующий синтаксис:

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

Если вы хотите продолжать использовать validates_inclusion_of, это также работает:

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