2011-02-14 20 views
0

我有一個觀察者設置如下:Rails的觀察,如何確定是什麼觸發了after_destroy

class FeedObserver < ActiveRecord::Observer 
    observe :permission 
    def after_destroy(record) 

    Rails.logger.info 'XXXXXXXXXXXXXXXXXXXXXXXXX Feed Observer - after_destroy  XXXXXXXXXXXXXXXXXXXXXXXXXXX' 
    Rails.logger.info record.inspect 
    Rails.logger.info record.class.name 
    Rails.logger.info record.class 
    Rails.logger.info 'XXXXXXXXXXXXXXXXXXXXXXXXX Feed Observer - after_destroy  XXXXXXXXXXXXXXXXXXXXXXXXXXX' 

    end 

end 

在這最終的日誌看起來有點像:

XXXXXXXXXXXXXXXXXXXXXXXXX Feed Observer - after_destroy  XXXXXXXXXXXXXXXXXXXXXXXXXXX 
#<Permission id: 52, project_id: 12, role_id: 2, user_id: 1> 
Permission 
Permission 
XXXXXXXXXXXXXXXXXXXXXXXXX Feed Observer - after_destroy  XXXXXXXXXXXXXXXXXXXXXXXXXXX 

的問題與此在我的權限控制器中有兩種方法可以刪除權限對象,destory和leaveproject ..

在觀察者中,如何確定哪種方法被稱爲r引發了飼料觀察員被稱爲?

謝謝

回答

0

那麼你不能知道,但我不應該很難找出。

其摧毀後,如果你是以下公約,它應該是在feeds_controller.rbFeedsController#destroy,或在:dependent => :destroy協會的情況下,它應該是在破壞行動的關聯控制器。

另一個簡單的辦法是太提高使用Ruby raise方法僞錯誤,並通過堆棧跟蹤

0

嘗試內核#主叫方將在執行堆棧點返回回溯走你的自我。試試吧:

def after_destroy(record) 
    Rails.logger.info caller.join("\n") 
    ... 

你會得到一些輸出,但如果你跳過rails框架的東西,你應該找到你的控制器代碼。

0

如果這對你來說真的很重要,一個更簡單的解決方案可能是在模型類上創建自己的方法來調用destroy並直接執行任何清理工作。此功能可以接收有關呼叫者的其他信息。像這樣的東西可以工作:

class Work < ActiveRecord::Base 
    def destroy_work(from) 
    self.destroy 
    Rails.logger.info "The work with the id of #{id} got destroyed by #{from}" 
    end 
end 

由於不依靠花哨的元編程(如檢查調用堆棧),你讓你的程序更加有彈性,也更容易理解。這同樣適用於回調,更適用於外部觀察者類。在原始模型中,回調的存在通常只有很少的痕跡(如果有的話)。這使分析行爲變得非常複雜且容易出錯,因爲您可以輕鬆忽略業務邏輯中潛在的重要部分。通過實現簡單的直線功能,可以使您的邏輯更容易理解,因爲它遵循簡單的直線。

如果有疑問,總是最可能工作的最愚蠢和最簡單的事情。你必須要聰明地調試代碼,因爲你必須編寫代碼。因此,聰明的事情可能會導致後來實際上無法維護的代碼,因爲人們不夠聰明,無法理解您的邏輯流程。

相關問題