rails验证:: allow_nil和:包含两者同时需要

时间:2013-06-28 07:52:13

标签: ruby-on-rails ruby validation inclusion

通常应将字段'kind'留空。 但如果它不是空白,则该值应包括在['a','b']

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

代码不起作用?

5 个答案:

答案 0 :(得分:36)

此语法将在允许nils时执行包含验证:

validates :kind, :inclusion => { :in => ['a', 'b'] }, :allow_nil => true

答案 1 :(得分:26)

在Rails 5中,您可以在包含块外部或内部使用allow_blank: true

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

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

提示:您可以将in: %w(a b)用于文本值

答案 2 :(得分:9)

另外检查:allow_blank =>真

答案 3 :(得分:1)

如果您试图通过belongs_to关联在Rails 5中实现此目的,请考虑默认行为要求该值存在。

要退出此行为,必须指定optional标志:

belongs_to :foo, optional: true 

validates :foo, inclusion: { in: ['foo', 'bar'], allow_blank: true } 

答案 4 :(得分:0)

在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比存储空值作为空字符串当然更好。