🖥

Railsのバリデーション – presence / allow_nil / allow_blank の違い・役割の整理

2024/01/02に公開

presence

値が空の場合にバリデーションエラーを起こす。

presence
このヘルパーは、指定された属性が空(empty)でないことを確認します。値がnilや空文字でない、つまり空でもなければホワイトスペースでもないことを確認するために、内部でObject#blank?メソッドを使っています。

例:

validates :foo_column, presence: true,

allow_nil

値がnilの場合にバリデーションをスキップする。

例:

validates :foo_column, format: { with: /REGEXP/ }, allow_nil: true

あくまで役割は「バリデーションのスキップ」なので、これを指定したからと言って値にNULLを許可するわけではない。
バリデーションを何も書かなければ、RailsのバリデーションとしてNULLは最初から許容される。

つまり何もバリデーションを指定せずに allow_nil: true を指定しても意味がない。
(エラーが発生する)

例:

validates :foo_column, allow_nil: true

# raise ArgumentError, "You need to supply at least one validation" if validations.empty?

この指定は属性のバリデーション全体ではなく、バリデーション指定の単位で評価される。
たとえば次のように書いた場合、値がNULLであっても、1行目のバリデーションはスキップされるが、2行目のバリデーションには引っかかる。

validates :foo_column, format: { with: /REG/}, allow_nil: true
validates :foo_column, format: { with: /EXP/ }

allow_blank

allow_nil と同じように動くが、こちらは値がblankの場合にバリデーションをスキップする。

すなわち presence と allow_blank を同時に指定しても意味がない

例:

validates :foo_column, presence: true, allow_blank: true

ガイド

https://railsguides.jp/active_record_validations.html

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2023-11-23

Discussion