Rails で public_activity.gem を使っていて、 activities
テーブルにレコードが追加されたタイミングで callback を仕掛けたい衝動に駆られた。ちょっと調べてみたけどやり方が見つからなかったので、チームの人と相談して以下のようにした。 public_activity は PublicActivity::Activity
というモデルを gem の中に持っていて、こいつが belongs_to :model
になる。
なのでこのモデルクラスを open して以下のように記述した。
# RAILS_ROOT/lib/public_activity/activity.rb
module PublicActivity
class Activity
after_create do
HogeHogeMailer.send_mail(self.trackable).deliver
end
end
end
ただしこのファイルを config/initializers/
とかで require してやらないと Rails がファイルを読み込んでくれない。 Rails.application.config.autoload_paths
に lib/**.rb
とかを追加しとけば自動的に読み込まれるんじゃないかなと思ったけどそうじゃなかった。 Rails の autoload は、 ConstMissing
という例外が発生したときに定数の名前からファイル名を推測して require するらしい。名前が既に定義済みだと ConstMissing
例外が発生せず autoload では読み込まれないので明示的に読み込む必要があるということらしい。
読み込みされていないクラスを使用すると ConstMissing という例外が発生します。 この部分に介入して autoload_paths の中に規約に合うファイルがあるか確認します。 存在する場合は読み込みします。 存在しない場合は ConstMissing を発生させます。
ナルホディウスですぞ〜!!!
そのうち忘れそうなのでここに書き記しておきます。