2010-09-07 76 views
14

我玩弄新的Rails 3 API和我有一個關於新方法的問題run_callbacks(kind, *args, &block)的Rails 3 run_callbacks方法

在下面的代碼:

class User < ActiveRecord::Base 
    before_save :say_hi 
    after_save :say_bye 

    private 

    def say_hi; puts "hi"; end 

    def say_bye; puts "bye"; end 

end 

我可以顯式調用在回調上節省運行:

> u.run_callbacks(:save) 
hi 
bye 
=> true 

我的問題是,我怎麼可以只有運行before_saveafter_save回調?

回顧run_callbacks(kind, *args, &block)代碼:

# File activesupport/lib/active_support/callbacks.rb, line 92 
def run_callbacks(kind, *args, &block) 
    send("_run_#{kind}_callbacks", *args, &block) 
end 

我不知道如何建立*args只後回調或之前調用,我想是這樣u.run_callbacks(:before_save)(給我未定義的方法誤差)和u.run_callbacks(:save, :before)運行全部保存回調(之前之後)。

回答

5

我仍然在尋找到如何只做after_save的,但僅運行before_save回調,你可以這樣做:

u.run_callbacks(:save) { false } 

這應該取消回調before_save的人都跑了。

7

看起來像是在運行Rails 3.0中的一個bug。它看起來像this lighthouse ticket中提到的3.0.1的隊列。

正如@venables所說,您至少可以通過發送falserun_callbacks(:save)來獲得before_save回調。

+0

是的,好像我們無法在'之前'或'之後'單獨保存回調:(至少以更清晰的方式:P – jpemberthy 2010-09-24 21:05:12

+0

@jpemberthy - 如果您更新您的問題的具體用途或許我們可以找出一種解決方法,直到解決了該錯誤爲止? – Brian 2010-09-24 22:19:46

+0

謝謝,但這不是必需的,我只是在玩新的API(感謝上帝)。從2.3.x或其他東西遷移我正在研究:P – jpemberthy 2010-09-26 21:41:43