10

こんにちは私は独特の問題を抱えています。after_commit コールバックを使用して通知を送信していますが、コールバックがまったくトリガーされていないようです。状況を簡略化すると、次のようになります。

class Message < ActiveRecord::Base
  after_commit :do_something

  def do_something
    raise 'Doing something'
  end
end

次に、コンソールを開いてメッセージを作成すると、レイズが発生することを期待していました。しかし、何も起こりません。さらに、「do_something」メソッドを完全に削除しても、レールは文句を言いません。これはトランザクション フィクスチャを使用したテストではないことに注意してください。データベースでコミットされたレコードも表示されます。私のレールのバージョンは 3.0.9 です。特にそれが良い場合は、助けてくれてありがとう:-)

編集:コードを別のマシンにデプロイすると、コールバック DID がトリガーされることを後で知りました。だから、それは私のセットアップに何かあるに違いありません。それでも、これを引き起こしている可能性のあるものについての洞察をいただければ幸いです。

Edit2:コメントから。

  • DB は MySQL であるため、トランザクションが存在します。
  • コールバックのアクションを指定しても役に立ちませんでした (:on => :create)。
  • after_commit が必要で、他のコールバックは必要ありません
4

6 に答える 6

7

デビッドは、質問のコメントでこの動作の説明について言及しました。

トランザクション コールバックのドキュメント

「これらのコールバックのいずれかで例外が発生した場合、他のコールバックに干渉しないように無視されます。そのため、コールバック コードで例外が発生する可能性がある場合は、それをレスキューして処理する必要があります。コールバック内で適切に。」

以下も参照してください。

于 2013-09-03T12:52:29.230 に答える
3

トランザクション フィクスチャを使用するときに after_commit コールバックを有効にするには、仕様/サポートにパッチを適用する必要がある場合があります。トランザクション フィクスチャを使用している場合、コミットは実際には発生しません。

パッチ: https://gist.github.com/charleseff/1305285

于 2013-03-15T06:44:55.740 に答える
0

以下のコードが役立つかどうか試してください -

class Message < ActiveRecord::Base
 after_commit :do_something, :only => [:create, :update, :destroy]

 def do_something
  raise 'Doing something'
 end
end
于 2012-10-26T11:48:58.243 に答える
0

この after_commit をトリガーする必要がある場合のアクションを指定する必要があります....

after_commit は基本的に、トランザクションの概念が存在するデータベースで使用されます...次のコードを試してください...

class Message < ActiveRecord::Base
 after_commit :do_something, :on => [:create, :update, :destroy]

 def do_something
  raise 'Doing something'
 end
end
于 2012-10-26T10:49:04.150 に答える
-2

あなたは以下を持っています:

class Message < ActiveRecord::Base
  after_commit :do_something

  def do_something
    puts 'Doing something'
  end
end

after_create必要に応じて、または必要に応じて試すことができafter_saveます。

after_commitsは、レコードがデータベースに正常に保存されたときに実行されます。保存、保存!トランザクション内の実行を破棄します。

ドキュメントに記載されているとおり:ActiveRecordのコールバック

于 2012-10-26T10:10:51.207 に答える