Skip to content

Instantly share code, notes, and snippets.

@serihiro
Last active March 16, 2016 15:00
Show Gist options
  • Select an option

  • Save serihiro/076d90948b9a670ff1f2 to your computer and use it in GitHub Desktop.

Select an option

Save serihiro/076d90948b9a670ff1f2 to your computer and use it in GitHub Desktop.
[WIP] rescue_fromに割り込む方法を調べる

やりたいこと

  • rescue_fromの前に割り込んでerorrオブジェクトをごにょごにょする

自分が思いついた方法

  • ApplicationController::Rescueprocess_actionをoverride
  • rescue_fromで登録したハンドラにerrorオブジェクトが渡される前に特定のメソッドを呼んでerrorオブジェクトに触れるようにする

rescue_fromの動作原理

適当に斜め読みした感じだと

  1. rescue_fromでハンドラを登録(ActiveSupport::Rescuable)
  2. ActionControllerのprocessが実行されたときにraiseしたら登録されたハンドラを使って処理できないか試す。多分起点はここ
  3. raiseされたエラーオブジェクトのクラスに一致するハンドラが登録されてないかチェック(ActiveSupport::Rescuable)
  4. 一致するハンドラがあったらそのハンドラを使ってエラーを処理する(ActiveSupport::Rescuable)

余談

  • actionpack/lib/action_controller/metal配下のモジュールは全部まとめてactionpack/lib/action_controller.rbでautoloadされている。ここ
  • Controllerの処理の起点はactionpack/lib/abstract_controller/base.rbに定義されているAbstractController::Base#process(action, *args)
  • AbstractController::Base#process(action, *args)の中で実行されているAbstractController::Base#process_action(method_name, *args)をmoduleなどでoverrideすることで処理を割り込ませて挙動を変えられるようになっている。actionpack/lib/action_controller/metal配下のmoduleでよくやっている。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment