2012-10-26 59 views
6

你好,我有一個奇怪的問題。我使用after_commit回調來發送通知,但似乎回調沒有被觸發。簡化的情況看起來像這樣:Rails不會觸發我的after_commit回調

class Message < ActiveRecord::Base 
    after_commit :do_something 

    def do_something 
    raise 'Doing something' 
    end 
end 

然後我希望在打開控制檯並創建消息時看到加註。但沒有任何反應。此外,如果我完全刪除'do_something'方法,rails甚至不會抱怨。請注意,這不是使用交易裝置的測試。我甚至可以看到在db中提交的記錄。我的rails版本是3.0.9。感謝任何幫助,特別是如果它是好的:-)

編輯:我後來知道,當我將代碼部署到不同的機器時,觸發DID被觸發。所以它必須是我的設置。不過,如果您對此有何看法,我會很感激。

編輯2:從評論。

  • 該數據庫是MySQL,因此交易存在。
  • 指定回調的動作沒有幫助(:on =>:create)。
  • 我需要after_commit並沒有其他的回調
+0

你如何創建控制檯模式 – felipeclopes

+0

我通過一家工廠,也可以通過試了救也救不了!電話 – Renra

+0

據我所知,他們都應該觸發回調,我也嘗試從生產控制檯。 – Renra

回答

-2

您有以下幾點:

class Message < ActiveRecord::Base 
    after_commit :do_something 

    def do_something 
    puts 'Doing something' 
    end 
end 

您可以根據您的需要after_createafter_save嘗試。

after_commits只是在記錄成功保存到數據庫時執行,因爲保存,保存!並銷燬交易中的運行。

如在文檔中發現:Active Record Callbacks

+4

我特別需要after_commit,因爲after_create可以在db執行前實際執行以便其他連接也可以讀取它。如果您發送通知給某個其他設備並記錄了該記錄,並且該記錄尚未存在 - >沒有任何反應。 – Renra

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 
+0

也這麼想,但沒有幫助。 – Renra

+0

對,我忘了提到DB是MySQL。 – Renra

+0

我認爲它應該沒什麼關係,因爲MySQL和Sqlite都支持這些事務,並且如果它不在MySQL上運行,那麼它也不會運行SQLite ......但是您仍然可以嘗試讓我知道結果。 .. –

0

嘗試,如果下面的代碼幫助 -

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

def do_something 
    raise 'Doing something' 
end 
end 
+0

不,這沒有幫助。查看問題的第二個編輯。不過謝謝。 – Renra

1

在使用交易裝置時,您可能需要在規格/支持中添加補丁以啓用after_commit回調。如果你正在使用交易裝置,那麼提交併不會真的發生。

補丁:https://gist.github.com/charleseff/1305285

+2

Gist已經被封裝爲gem並且也在工作https://github.com/grosser/test_after_commit – dolzenko