Callbacksの問題点についてはこちら。 ActiveRecordのObserversやCallbacksの問題点 - komagataのブログ
Callbacksの問題点を解決する薄いpub/subライブラリのnewspaper gemを作りました。
こういうのを
class User
after_create UserCallbacks.new
end
class UserCallbacks
def after_save(user)
# do something
end
end
@user.save
こう書き換えられます。
# app/models/sign_up_notifier.rb
class SignUpNotifier
def call(payload)
# do something
end
end
# config/initializers/newspaper.rb
Newspaper.subscribe(:user_create, SignUpNotifier.new)
# app/controllers/users_controller.rb
Newspaper.publish(:user_create, payload)
SubscriberはただのRubyオブジェクトなのでテストし易いです。
既存のpub/subライブラリのように非同期実行する機能などはありません。また、ちゃんとしたPublisher / Subscriberパターンのようなクラス構成にはなっておらず、簡単な構造になっています。
このgemを作ってるところの動画
僕らがやっているプログラミングスクールのフィヨルドブートキャンプでは最近ペアプロやモブプロが盛んに行われています。もっと敷居を下げるために「このgemを作っているところ」をモブプロでやって録画しました。
オープソースで公開しているフィヨルドブートキャンプ本体のCallbacks をこのgemに置き換えるところもやりました。
簡単なgemなのでRubyプログラマーの人にはあまり面白く無いかもですが、今Ruby入門中の人やgemを作りたい人の参考になれば幸いです。