Ruby on Railsで独自バリデーションを追加する方法を紹介します。
【Rails】独自バリデーションを追加する方法
一般的なバリデーションはモデルに以下のような各カラムのバリデーションを追加していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Company < ApplicationRecord ## # バリデーション ## # 企業名 validates :company_name, presence: true # 備考 validates :remarks, length: { maximum: 1000 } end |
独自バリデーションを追加する場合は、以下の「validate :〇〇」のように、独自バリデーションの処理をprivateに書き、そのメソッド名を追記するだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Company < ApplicationRecord ## # バリデーション ## validate :office_is_exist private # 事務所存在チェック def office_is_exist if ! Office.where(id: office_id).all.present? errors.add(:office_id, "は存在しません。") end end end |
例えば新規登録時のみバリデーションしたい場合は、「return false unless new_record?」を処理のはじめに追記することで新規登録か更新かを判定できます。
新規登録でない場合はfalseを返し、バリデーションは実行されません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Company < ApplicationRecord validate :office_is_exist private # 事務所存在チェック # note: 新規登録のみバリデーション処理を実行 def office_is_exist return false unless new_record? if ! Office.where(id: office_id).all.present? errors.add(:office_id, "は存在しません。") end end end |
ちなみにバリデーションのトリガは「create」、「update」、「save」メソッドで発動されます。
また、valid?(invalid?)メソッドを使って、手動でトリガすることもできます。
参考: