条件つきバリデーションとは?
標準であるバリデーションだけでは対応できずに、特定の条件を満たす場合に実行したいバリデーションのこと。[if],[unless]オプションを使用して記述することで、
特定の条件に対応することができる。
引数にProc,Arrayを使える。
if #特定の条件でバリデーションを行いたい時に使用
unless #特定の条件でバリデーションを行いたくない時に使用
if,unless
class Pass < ApplicationRecord
validates :number, presence: true, if: :pass_number?
def pass_number?
pass_type == "pass"
end
end
class Money < ApplicationRecord
#money_validate関数の呼び出し
validate :money_validate
def money_validate
unless money.nil? || money > 0.0
end
end
Proc
呼び出したいProcオブジェクトを:ifや:unlessで使うこともできます。Procオブジェクトを使うと、個別のメソッドを指定する代りに、その場で条件を書けるようになります。ワンライナーに収まる条件を使いたい場合に最適です ~Railsガイド~class Account < ApplicationRecord
validates :password, confirmation: true,
unless: Proc.new { |a| a.password.blank? }
end
~Railsガイド~
リファレンスには上記のように記述されていましたが、
Proc。newでオブジェクトを作成、引数aに渡し、
a.password.blank?で真偽値の判断?
条件付きバリデーションのグループ化
with_options
1つの条件を複数のバリデーションでまとめて処理を行うにはwith_optionsを使用class User < ApplicationRecord
with_options if: :is_admin? do |admin|
admin.validates :password, length: { minimum: 10 }
admin.validates :email, presence: true
end
end
Rails ガイド
if: :is_admin?という条件に対してバリデーションが働く
Array,配列
バリデーションを行なう条件を複数定義する際には、Array 配列を使用class Computer < ApplicationRecord
validates :mouse, presence: true,
if: [Proc.new { |c| c.market.retail? }, :desktop?],
unless: Proc.new { |c| c.trackpad.present? }
end
Railsガイド
備忘録です。
参考サイト
https://railsguides.jp/active_record_validations.html#%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B-errors