Subscribed unsubscribe Subscribe Subscribe

Rails - ActiveModel::Callbacksでカスタムコールバックヘ(^o^)ノ

あけましておめでとうございます。

年内で仕事が納まらず、1日からコードをごりごり書いております。。。

さて、ActiveRecord::Callbacksはみなさんおなじみ

before_saveとか良く使いますよね?

でも、今回やりたい事はこういうの

# app/models/comment.rb
class Comment < ActiveRecord::Base
  after_publish :send_mail  #publishメソッドのCallback

  def publish
    [...]
  end

  private
  def send_mail
    Notifier.comment_published(self).deliver_now
  end
end

そこでActiveModel::Callbacksです

ActiveRecordのCallbacksを参考に => active_record/callbacks.rb

# app/models/concerns/comment_callbacks.rb
module CommentCallbacks
  extend ActiveModel::Callbacks
  extend ActiveSupport::Concern

  included do
    define_model_callbacks :publish, only: :after
  end

  private
  def action_after_publish
    puts '- after publish'
  end
end

# app/models/comment.rb
class Comment < ActiveRecord::Base
  include CommentCallbacks

  after_publish :action_after_publish
  
  def publish
    run_callbacks :publish do
      puts '> publish!'
    end
  end
end
$ Comment.new.publish
> publish!
- after publish

ちゃんとCallbackされましたね

もっと良い実装があれば教えてくだされー

そもそも、この実装が良いのかもわからんし...( ̄▽ ̄;)

Happy Hacking٩( ‘ω’ )و