【Rails】条件付きバリデーションをグループ分けする

【Rails】条件付きバリデーションをグループ分けする Ruby / Rails

Railsにはバリデーションを簡単に実装できる機能があります。

条件によってバリデーションを実行したい場合がよくあると思うので、基本的なことを書いていきます。

条件によってvalidationをかける

ある条件によってバリデーションを実行したい時に :if:unless オプションを使用することで条件を指定することができます。

:if:unlessオプションにメソッド名をシンボルで指定することで、条件を満たした時だけバリデーションの直前に呼び出されます。

# 以下のコードは「Railsガイド Active Record バリデーション 5.1」からの引用です

class Order < ApplicationRecord
  validates :card_number, presence: true, if: :paid_with_card?
 
  def paid_with_card?
    payment_type == "card"
  end
end

条件付きのvalidationをグループ分けする

ある条件で複数のバリデーションを実行したい時は、バリデーションごとに:if:unless オプションで同じメソッドを指定しなくても条件を共有することができます。

1つの条件を複数のバリデーションで共用できると便利なことがあります。これはwith_optionsを使うことで簡単に実現できます。

以下のようにwith_optionsを使用します。

# 以下のコードは「Railsガイド Active Record バリデーション 5.3」からの引用です

class User < ApplicationRecord
  with_options if: :is_admin? do |admin|
    admin.validates :password, length: { minimum: 10 }
    admin.validates :email, presence: true
  end
end

ブロックの内にある全てのバリデーションには、if: :is_admin?という条件が共有されます。

参考記事