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?
という条件が共有されます。