今回は実務で使ったActiveModel::Callbacksモジュールのdefine_model_callbacksメソッドについてまとめていこうと思います。
結論から言うと、ActiveModel::Callbacksモジュールは、Active ModelでActive Recordと同じようなコールバック機能の実装を簡単にしてくれるモジュールのことです。
ActiveModelとは
モデルに関するモジュール群を提供しているライブラリで、ActiveRecordの実装にも利用されています。
通常、modelとテーブルは対になってるのですが、ActiveModelを利用することで、データベースと紐づかないモデルを作成することができます。
どういった時に利用するかと言いますと、モデルやコントローラが肥大化しないように機能ごとにモジュールとして分けて作成したときです。その時は、Railsのフレームワークから一度外れてしまうので、ActiveRecordと同じようにオブジェクトを扱うためにはこのモジュールをミックスインする必要があります。
ActiveModel::Callbacksとは
冒頭でも述べましたが、ActiveModel::Callbacksモジュールは、任意のクラスにコールバック機能の実装を簡単にしてくれるモジュールのことです。
このモジュールにより、必要なタイミングで実行されるコールバックを定義することができるようになります。
ActiveRecordのモデルであれば、自動的にコールバックを仕込むことができたのですが、ActiveModelの場合は、一旦Railsのレールから外れているため、ActiveRecordモデルと同じように扱いたいのであればモジュールであるActiveModel::Callbacksをextendして使う必要があります。
class Board
extend ActiveModel::Callbacks
define_model_callbacks :run
def run
run_callbacks :run do
true # runメソッドの中身をここに記述する
end
end
end
define_model_callbacksメソッドは、ActiveModel::Callbacksをextendして、コールバックの対象となるメソッドの名前を指定してやることでそのメソッドを実行することができます。
define_model_callbacksメソッドは、3つの標準コールバック(before, around, after)の全てのコールバックを提供してくれるメソッドになります。
コールバックしたいタイミングを限定したい時はこのように書くことができます。
class Board
extend ActiveModel::Callbacks
define_model_callbacks :run, only: %i[after, before]
def run
run_callbacks :run do
true # runメソッドの中身をここに記述する
end
end
end
その他のコールバックについて
ActiveRecordと同様に、before_createやaround_create、after_createもActiveModel::Callbacksモジュールをミックスインすることで利用することができるようになります。
最後に
最後まで読んでいただきありがとうございました。
私も唐突にこのコードがプロジェクト内で出て来て焦りましたが、一つずつコードを追いかけることでどのようにアプリ上で利用されているのかがわかってスッキリしました。
ActiveModelにはその他にも
- ActiveModel::Attributes
- ActiveModel::Serialization
- ActiveModel::Validations
- ActiveModel::Model
- ActiveModel::Conversion
- ActiveModel::Dirty
- ActiveModel::Naming
といったモジュールも用意されておりますので機会があればこちらもブログで触れていければと思います。
今後も実務でわからなかった内容をブログでまとめていこうと思いますので、よろしくお願いします。
参考サイト
Railsガイド Active Modelの基礎
https://railsguides.jp/active_model_basics.html#callbacks%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB
- 無料・簡単・片手でホームページを作成できる自社サービス Rakwi
- Web制作とアプリ開発を学べるオンラインプログラミング講座 Upstairs
- 開発,DX推進支援サービス スタートアッププラン