📅  2021-06-05

Railsのコールバックについて


Railsのコールバックについてよく分からない箇所があったので記録を残しておきます。

コールバックとは

モデルのCRUDなどのイベントのタイミングで特定の処理を呼び出すこと

モデルにコールバックメソッドを直接書く

# app/models/memo.rb
class Memo < ApplicationRecord
  after_create :after_create_message #createアクション後に呼び出すメソッド名をシンボルで指定する

  private

  def after_create_message
		puts 'memo was created!!!!'
  end
end
# rails c
Memo.create
#=> 'memo was created!!!!'

コールバッククラスを別で作る

# app/models/memo.rb
class Memo < ApplicationRecord
  after_create MemoCallbacks.new #コールバックインスタンスを渡す
end
# app/models/memo_callbaks.rb
class MemoCallbacks
	 def after_create
		puts 'memo was created!!!!'
  end
end
# rails c
Memo.create
#=> 'memo was created!!!!'

コールバッククラスのメソッドがクラスメソッドの場合

# app/models/memo.rb
class Memo < ApplicationRecord
  after_create MemoCallbacks #クラス名を渡す
end
# app/models/memo_callbaks.rb
class MemoCallbacks
	 def self.after_create
		puts 'memo was created!!!!'
  end
end
# rails c
Memo.create
#=> 'memo was created!!!!'

コールバッククラスを作るとモデルインスタンスを渡すことができる

# app/models/memo.rb
class Memo < ApplicationRecord
  after_create MemoCallbacks
end
# app/models/memo_callbaks.rb
class MemoCallbacks
  def self.after_create(memo) # 引数でモデルインスタンスを渡せる
    puts "title is #{memo.title}"
  end
end
# rails c
Memo.create(title: 'About Rails Callback') 
#=> "title is About Rails Callback"

多分これが一番使い勝手がいい

最初`after_create MemoCallbacks.new`みたいなコードを見て、インスタンスを渡しているだけで何もしていないのでは?と勘違いしてしまっていたけどActive Recordの機能の一部みたいでした。Railsは学べば学ぶほど便利だな〜。

参考: Active Record コールバック \- Railsガイド

タグ