2010-09-16 68 views
0

我該如何瞭解創建或其他操作是否從模型中調用。基本上我正在做數據庫日誌記錄,並希望跟蹤是否正在執行創建或其他操作。確定模型內正在調用哪個動作。 Ruby on Rails

對於做日誌記錄部分,我使用的是ActiveRecord::Observer的概念。但是我無法確定用戶是在創建還是在做其他事情。所以請告訴我一些軌道提供給我們以確定模型內部動作的方式。

在此先感謝。

+0

什麼是日誌記錄功能? – 2010-09-16 11:54:05

回答

0

保存模型時,可以使用before_save觸發事件。要確定它是保存還是創建,您可以使用此方法new_record?,它會告訴您它是否是新實例。您還可以知道哪些屬性具有changed

+0

這將明確區分新操作和更新操作,但是如果用戶刪除了記錄,該怎麼辦。你如何跟蹤銷燬行動 – Rohit 2010-09-16 12:37:45

+0

before_destroy:http://railsapi.com/doc/rails-v2.3.8/classes/ActiveRecord/Callbacks.html#M001205 – hellvinz 2010-09-16 12:42:18

+0

哎呀對不起忘了before_destroy回調:) – Rohit 2010-09-16 12:54:36

1

在應用程序中調用哪個任何動作都存儲在params [:action]中,並且模型中不能訪問參數。 所以我不認爲你可以看到哪些動作被模型調用。

感謝,Anubhaw

+0

嘿謝謝@Anubhaw。我知道那一部分。但ActiveRecord :: Observer是一個ActiveRecord類,即類似模型,可能有一些解決方法。 – Rohit 2010-09-16 11:34:04

+1

嘿,你可以看看下面的帖子http://m.onkey.org/2007/10/17/how-to-access-session-cookies-params-request-in-model,但它不是最好的方法就像你在郵件中發現的那樣。我不瞭解觀察員。 – Anubhaw 2010-09-16 11:53:55

3

這樣的這種跟蹤應當在控制器中進行。 觀察員只能識別模型,並且應該只能識別模型。

考慮你從控制檯更新對象的情況。 觀察者將被觸發,但您在這裏沒有請求上下文。

+0

感謝您的額外的知識,但我想創建一個日誌,因爲我之前告訴過,並且我有一個存儲已執行操作的列。日誌記錄部分正在Observer中執行。 – Rohit 2010-09-16 12:30:47

+0

這個,聽simone。您無法訪問模型中的數據請求是有原因的。 – Faisal 2010-09-16 12:31:43

+0

我瞭解@Faisal,但這是情況的需要。我能做什麼? – Rohit 2010-09-16 12:38:42

0

從體系結構的角度來看,這不推薦使用,但這僅用於深層模型內的低級別日誌記錄,並且不會造成任何傷害。這也是線程安全的解決方案。

的ApplicationController或者只是單個控制器:

around_filter :store_remote_ip_in_thread 

def store_remote_ip_in_thread 
    begin 
    Thread.current[:remote_ip] = request.remote_ip 
    yield 
    ensure 
    Thread.current.delete :remote_ip 
    end 
end 

檢索可重複使用的模塊:

module RemoteIpAware 
    def current_remote_ip 
    Thread.current[:remote_ip] || '-' 
    end 
end 

某處模型/郵件/ lib下類:

include RemoteIpAware 
... 
#use current_remote_ip method anywhere 

請記住我寫的它從我的記憶..語法可能不行;) 在你的情況下廣告的遠程IP可以保存參數[:action]:控制器名稱等。

+0

請不要這樣做。線程不是類似PHP的全局變量,不應該以那種方式使用。 – 2010-09-16 17:52:28