0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails初学者】バリデーションの基礎についてざっくり理解する -Part4(共通オプション)

Last updated at Posted at 2025-12-14

Part3 続き

前回の記事では、Railsの各種バリデータについてまとめました📙
今回はバリデーションで使用できる共通オプションと条件付きバリデーションについてまとめていきたいと思います!

validation-flow2.png

バリデーションの共通オプション

Part2, Part3で紹介した各種バリデーションには、共通して使用できるオプションがいくつか存在します!ここではそれらについてまとめていきます✍️

オプション名 説明
message カスタムエラーメッセージを指定
on バリデーションを実行するタイミングを指定
allow_nil 属性の値がnilの場合、バリデーションをスキップ
allow_blank 属性の値が空文字列またはnilの場合、バリデーションをスキップ
if 条件が真の場合にのみバリデーションを実行
unless 条件が偽の場合にのみバリデーションを実行

message

デフォルトのエラーメッセージをカスタムメッセージに変更したい場合に使用します!
エラーメッセージは文字列またはProcで指定できます。このオプションを使用しない場合は、各バリデーションに応じたデフォルトのエラーメッセージが使用されます。

class User < ApplicationRecord
  validates :name, presence: { message: "ユーザー名を省略することはできません" }
  validates :age, numericality: { message: "%{value}は有効な数値ではありません" }
end

文字列の場合、%{value}%{attribute}%{model}のいずれか、またはそれらの組み合わせを使用して、属性の値、属性名、モデル名をメッセージに含めることができます!
これらのプレースホルダは、バリデーションが失敗したときに対応する値に置き換えられます。

Proc:message値は、次の2つの引数を受け取ります。

class User < ApplicationRecord
  validates :email,
    uniqueness: {
      message: -> (object, data) do
        "#{object.name}様、#{data[:value]}はすでに使用されています。別のメールアドレスを入力してください。"
      end
    }
end

Procを使用することで、動的にエラーメッセージを生成することができます!

on

バリデーションを実行するタイミングを指定します!
デフォルトでは、すべての保存操作(createおよびupdate)でバリデーションが実行されますが、onオプションを使用して特定のタイミングでのみバリデーションを実行するように制限できます。

class User < ApplicationRecord
  # 値が重複していてもnameを更新できる
  validates :name, presence: true, on: :create
  # 値が重複していてもemailを作成できる
  validates :email, presence: true, on: :update

  # デフォルトでは、作成・更新の両方でバリデーションが実行される
  validates :age, numericality: { only_integer: true }
end
  • :create - レコードが新規作成されるときにのみバリデーションを実行します。
  • :update - 既存のレコードが更新されるときにのみバリデーションを実行します。

allow_nil

属性の値がnilの場合、バリデーションをスキップします!

class User < ApplicationRecord
  validates :password, format: { with: /\A[a-zA-Z0-9]+\z/ }, allow_nil: true
end

この場合、password属性がnilの場合、formatバリデーションはスキップされます。

allow_blank

属性の値が空文字列またはnilの場合、バリデーションをスキップします!
使用場面は、入力フォームの任意項目などで空文字列が許容されるときが多いです。

class User < ApplicationRecord
  validates :nickname, length: { maximum: 30 }, allow_blank: true
end

この場合、nickname属性が空文字列またはnilの場合、lengthバリデーションはスキップされます。

ifunless

条件付きでバリデーションを実行したい場合に使用します!
ifオプションは条件が真の場合にのみバリデーションを実行し、unlessオプションは条件が偽の場合にのみバリデーションを実行します。

引数には、シンボル、ProcArrayが指定できます。

シンボルを渡す場合

class User < ApplicationRecord
  validates :payment_method, presence: true, if: :premium_member?

  def premium_member?
    membership_type == 'premium'
  end
end

Procを渡す場合

class User < ApplicationRecord
  validates :discount_code, presence: true,
    if: Proc.new { |user| user.age >= 65 }
end

Procオブジェクトを使えば、別のメソッドを定義せずに条件を直接指定できます!
シンプルな条件の場合はこちらの方が便利かもしれません。

またlambda記法(->)も使用できます。

class User < ApplicationRecord
  validates :discount_code, presence: true, if: ->(user) { user.age >= 65 }
end

Part5へ続く

今回はバリデーションで使用できる共通オプションについてまとめました📚
次回はカスタムバリデーションについてまとめていきたいと思います!

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?