コールバックとは?
Railsのモデルには登録処理や削除処理等がありますがそのような処理の前後に任意の処理を挟むことができることです。JavaScriptでも引数として関数を渡して任意のタイミングで実行してもらうコールバックという仕組みがありますがプログラミングでは一般的な用語になっています。
モデルオブジェクトのライフサイクル
モデルオブジェクトのライフサイクルは「登録処理」、「更新処理」、「削除処理」によってそれぞれ分かれます。
登録処理の場合
モデルの登録処理をする場合は下記のようなライフサイクルに分かれておりそれぞれの工程の前後でコールバックメソッドを実行できます。
- 1.モデルオブジェクトをnewする。
- 2.検証する。
- 3.登録する。
1.モデルオブジェクトをnewする。
after_initialize
2.検証する。
before_validation
検証前に値を正規化する場合に使ったりします。
after_validation
検証後に検証結果のエラーメッセージを加工するために使います。
3.登録する。
before_save
データ保存前にバックエンドで行いたい処理をします。(主にユーザーがエラーを見てもどうにもできない異常を防ぐための処理です。)
before_create
データ保存前にバックエンドで行いたい処理をします。(主にユーザーがエラーを見てもどうにもできない異常を防ぐための処理です。)
around_save
around_create
after_save
モデル状態に応じて他のモデルの状態も変えたい場合に記述する処理です。また、ユーザーがエラーを見てもどうにもできない異常を防ぐための処理も記述します。
after_create
モデル状態に応じて他のモデルの状態も変えたい場合に記述する処理です。また、ユーザーがエラーを見てもどうにもできない異常を防ぐための処理も記述します。
「更新処理」の場合
モデルの更新処理をする場合は下記のようなライフサイクルに分かれておりそれぞれの工程の前後でコールバックメソッドを実行できます。
- 1.対象のモデルオブジェクトを検索する。
- 2.検証する。
- 3.登録する。
1.対象のモデルオブジェクトを検索する。
after_find
after_initialize
2.検証する。
before_validation
検証前に値を正規化する場合に使ったりします。
after_validation
検証後に検証結果のエラーメッセージを加工するために使います。
3.更新する。
before_save
データ保存前にバックエンドで行いたい処理をします。(主にユーザーがエラーを見てもどうにもできない異常を防ぐための処理です。)
before_update
データ保存前にバックエンドで行いたい処理をします。(主にユーザーがエラーを見てもどうにもできない異常を防ぐための処理です。)
around_save
around_update
after_save
モデル状態に応じて他のモデルの状態も変えたい場合に記述する処理です。また、ユーザーがエラーを見てもどうにもできない異常を防ぐための処理も記述します。
after_update
モデル状態に応じて他のモデルの状態も変えたい場合に記述する処理です。また、ユーザーがエラーを見てもどうにもできない異常を防ぐための処理も記述します。
「削除処理」の場合
モデルの削除処理をする場合は下記のようなライフサイクルに分かれておりそれぞれの工程の前後でコールバックメソッドを実行できます。
- 1.対象のモデルオブジェクトを検索する。
- 2.削除する。
対象のモデルオブジェクトを検索する。
after_find
after_initialize
削除する。
before_destroy
削除がOKか確認しダメな場合は例外を出力します。
around_destroy
after_destroy
モデルの削除に応じて他のモデルも削除するかどうか等の処理を記述します。
フィルタ(Filter)とは?
Railsのコントローラの機能でアクションで処理をする前後で任意の処理を挟むことです。
コールバックとの使い分けは?
アクションの前後で処理を追加できる機能としてはコールバックがあると思います。コールバックの前処理で例えばリダイレクトとかをしてしまうとそのアクションは絶対に処理が行われない形になってしまいます。特定の状況だけでもアクションを実行できるようにする目的でよく使われるのがこのフィルタ(Filter)という機能なのです。
実装方法
フィルタとしてメソッドを登録して、実際にメソッドを実装するというやり方で追加をします。全機能共通の機能のフィルタを実装する場合はApplicationControllerに実装することが一般的です。
before_action
アクションの前に呼ばれるフィルタのことです。
onlyオプション
フィルタを適用するアクションを指定することができます。
skip_before_action
特定のアクションだけはフィルタを通らないようにすることがデイます。
この記事へのコメントはありません。