Reputation: 861
Usually the field 'kind' should be allowed blank. but if it is not blank, the value should included in ['a', 'b']
validates_inclusion_of :kind, :in => ['a', 'b'], :allow_nil => true
The code does not work?
Upvotes: 56
Views: 37539
Reputation: 786
In Rails 5.x you need, in addition to the following line, to call a before_validation
method:
validates_inclusion_of :kind, :in => ['a', 'b'], :allow_nil => true
The before_validation
is needed to convert the submitted blank value to nil
, otherwise ''
is not considered nil
, like this:
before_validation(on: [:create, :update]) do
self.kind = nil if self.kind == ''
end
For database disk space usage it is of course better to store nil
's than storing empty values as empty strings.
Upvotes: 3
Reputation: 1500
If you are trying to achieve this in Rails 5 in a belongs_to
association, consider that the default behaviour requires the value to exist.
To opt out from this behaviour you must specify the optional
flag:
belongs_to :foo, optional: true
validates :foo, inclusion: { in: ['foo', 'bar'], allow_blank: true }
Upvotes: 3
Reputation: 541
In Rails 5 you can use allow_blank: true
outside or inside inclusion block:
validates :kind, inclusion: { in: ['a', 'b'], allow_blank: true }
or
validates :kind, inclusion: { in: ['a', 'b'] }, allow_blank: true
tip: you can use in: %w(a b)
for text values
Upvotes: 54
Reputation: 14038
This syntax will perform inclusion validation while allowing nils:
validates :kind, :inclusion => { :in => ['a', 'b'] }, :allow_nil => true
Upvotes: 50