web-dev-qa-db-ja.com

rails validation::allow_nilと:inclusionは両方とも同時に必要です

通常、フィールド「種類」は空白のままにしてください。ただし、空白でない場合は、値を['a'、 'b']に含める必要があります

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

コードが機能しませんか?

39
Daniel

この構文は、nilsを許可しながら包含検証を実行します。

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

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)を使用できます

29
vasylmeister

次も確認してください:allow_blank => true

9
Oren

belongs_toアソシエーションのRails 5でこれを達成しようとしている場合、デフォルトの動作では値が存在する必要があると考えてください。

この動作をオプトアウトするには、optionalフラグを指定する必要があります。

belongs_to :foo, optional: true 

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

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を保存する方が良いことは言うまでもありません。

0
W.M.