ActiveRecord::Errors関係をいろいろいじりたいと思って、まずは、ActiveRecord::Validationをかじってみた。
Validationの流れの参考にでもなれば。
- ActiveRecord::Baseが、Module ActiveRecord::Validationsをinclude
- ActiveRecord::Validationsでは、
- validate, validate_on_create, validate_on_updateのそれぞれのメソッドを定義。
- これらのメソッド呼び出しにより、個々のvalidatorをCallbackChainに登録できる
(validate do |record| true;end とやると validate_callback_chainにこのブロックが登録される。) - これらのメソッドを利用して
validates_each, validates_confirmation_of, vaidates_acceptance_of, vaidates_presence_of, validates_length_ofをCallbackChainに登録 - :save_with_validation :save_with_validation! を定義
valid?メソッド経由でcallbackchainを順番に呼び出し - alias_method_chainによるsaveのリプレース
- alias_method_chain :save, :validation
- alias_method_chain :save!, :validation
これにより
save => save_with_validation, save! => save_with_validation!
オリジナルのsave/save!は、
:save_without_validation , :save_without_validation!
にalias
最終的に、save/save!を契機にvalidation関連が呼ばれる。
だいたいそんな感じっぽい
参考:
- validations.rb
- ActiveRecord::Validations
- ActiveRecord::Errors
- callbacks.rb
- ActiveSupport::Callbacks
ツイート