проверка рельсов: :allow_nil и :inclusion необходимы одновременно

Обычно поле «вид» следует оставлять пустым. но если он не пуст, значение должно быть включено в ['a', 'b']

validates_inclusion_of :kind, :in => ['a', 'b'], :allow_nil => true

Код не работает?


person Daniel    schedule 28.06.2013    source источник
comment
вы говорите нам, это работало в ваших тестах?   -  person tokland    schedule 28.06.2013
comment
это не работает в моем rspec?   -  person Daniel    schedule 28.06.2013


Ответы (5)


Этот синтаксис будет выполнять проверку включения, разрешая nil:

validates :kind, :inclusion => { :in => ['a', 'b'] }, :allow_nil => true
person Matt    schedule 28.06.2013
comment
Не уверен на 100%, но я думаю, что allow_nil должен быть внутри хэша включения. - person aceofspades; 28.06.2013
comment
Синтаксис правильный для Rails 3.2 (проверено), я не знаю, может ли ваше предложение быть действительным для другой версии? - person Matt; 28.06.2013
comment
Возможно. Мне это кажется неправильным, потому что на самом деле это исключение из требования о включении, которое само по себе не сработало бы. Если работает то работает! - person aceofspades; 28.06.2013
comment
Это исключение из любой проверки: если значение пустое, дальнейшая проверка не выполняется. - person rewritten; 17.10.2013

В Rails 5 вы можете использовать allow_blank: true снаружи или внутри блока включения:

validates :kind, inclusion: { in: ['a', 'b'], allow_blank: true }

or

validates :kind, inclusion: { in: ['a', 'b'] }, allow_blank: true

совет: вы можете использовать in: %w(a b) для текстовых значений

person vasylmeister    schedule 06.03.2017
comment
Rails 5.2: allow_blank и allow_nil работают независимо друг от друга. Вам потребуется перезапустить веб-сервер, если вы меняете этот код в файле model.rb. - person MSC; 13.12.2018
comment
Rails 5.2: allow_nil не работает ни внутри, ни снаружи хеша. allow_blank работает. - person tfwright; 12.03.2019
comment
Обратите внимание, что разница в размещении влияет на сообщения об ошибках, которые генерируются, когда атрибут не проходит проверку. - person jbarr; 06.06.2019

проверьте также :allow_blank => true

person Oren    schedule 11.03.2014
comment
allow_nil: true не работал в приложении Rails 4, над которым я работал. Я могу подтвердить, что это работает в Rails 4. - person Richard Jones; 18.07.2015
comment
подтверждение allow_nil: true НЕ работает в Rails 5... это работает в Rails 5. - person daino3; 02.12.2016

Если вы пытаетесь добиться этого в Rails 5 в ассоциации belongs_to, учтите, что поведение по умолчанию требует, чтобы значение существовало.

Чтобы отказаться от этого поведения, вы должны указать флаг optional:

belongs_to :foo, optional: true 

validates :foo, inclusion: { in: ['foo', 'bar'], allow_blank: true } 
person Fabrizio Regini    schedule 21.03.2019

В Rails 5.x вам нужно, помимо следующей строки, вызвать метод before_validation:

validates_inclusion_of :kind, :in => ['a', 'b'], :allow_nil => true

before_validation необходим для преобразования отправленного пустого значения в nil, иначе '' не считается nil, например:

  before_validation(on: [:create, :update]) do
    self.kind = nil if self.kind == ''
  end

Для использования дискового пространства базы данных, конечно, лучше хранить nil, чем хранить пустые значения в виде пустых строк.

person W.M.    schedule 01.08.2019