37

私はしばらくの間Railsソースを調べてきましたが、以下以外のすべてのコールバックのリストを取得するためのより良い方法はないと思います。–ActiveRecord::Callbacks::CALLBACKSこれは定数リストです。

:invitation_acceptedつまり、スコア:afterで呼び出される新しいコールバックを追加するdevise_invitableのようなgemを使用している場合、:beforeそれは機能しActiveRecord::Callbacks::CALLBACKSません。

Railsモジュールを開いて、モデルクラスごとのコールバックの内部リストがあることを確認する以外に、簡単な修正を知っていますか?

4

6 に答える 6

51

を呼び出しModel._save_callbacksて、保存時にすべてのコールバックのリストを取得できます。次に、必要な種類に絞り込むことができます。たとえば:before:after次のようにします。

Model._save_callbacks.select {|cb| cb.kind == :before}

Model._destroy_callbacksなどでも同じように動作します。

于 2013-01-15T09:33:58.863 に答える
20

ドキュメントには、「合計で 19 のコールバックがあります」と書かれていますが、それらの 19 のすべてが実際に何であるかは述べていないようです!

私のように「すべての ActiveRecord コールバックのリスト」を Google で検索した人のために、ここにリストを示します (ActiveRecord::Callbacks::CALLBACKS質問で説明されているように使用して見つけました)。

:after_initialize
:after_find
:after_touch
:before_validation
:after_validation
:before_save
:around_save
:after_save
:before_create
:around_create
:after_create
:before_update
:around_update
:after_update
:before_destroy
:around_destroy
:after_destroy
:after_commit
:after_rollback
于 2013-12-18T08:29:48.987 に答える
3

メソッドより前の Rails バージョンで作業している場合は._save_callbacks、次を使用できます。

# list of callback_chain methods that return a CallbackChain
Model.methods.select { |m| m.to_s.include? "callback" }.sort

# get all methods in specific call back chain, like after_save
Model.after_save_callback_chain.collect(&:method)
于 2015-12-24T18:12:37.003 に答える
3

単にコールバックをトリガーしたい場合は、次の#run_callbacks(kind)メソッドを使用できることに注意してください。

o = Order.find 123 # Created with SQL
o.run_callbacks(:create)
o.run_callbacks(:save)
o.run_callbacks(:commit)
于 2013-09-25T15:49:14.557 に答える