Railsのvalidationの流れをもうちょっと細かく  [rails]  [tips]

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