2012-01-20 54 views
4

有#2幾個類似的問題有關獲取CURRENT_USER形式的Rails 3名觀察員,但基本思路是一樣的:Rails 3的觀察員和CURRENT_USER

1)通過

CURRENT_USER的傳球
attr_accessor :current_user 

模型我們需要觀察。但是這對我來說是不可接受的,因爲我需要觀察10個模型(創建,更新,刪除動作),並且我不想在每個控制器的每個動作上傳遞這個。

2)將當前用戶存儲在線程中。完全不能接受。

那麼最佳實踐是什麼?而且,讓我們說,我想不僅在我的觀察員中獲得current_user,還要獲得IP地址?

任何想法?

+2

這或多或少都會讓人皺起眉頭,所以出於這個原因,它實際上有點棘手,最後很可能不會覺得很優雅。 其中一個原因(多個)是說,例如你需要導入數據到你的rails程序。這需要現在訪問你的模型和相應的觀察者,但是如果你從命令行工作,那麼沒有當前用戶。所以現在你已經將應用程序限制爲只能在Web服務器後面工作,所以像海量數據導入一樣會很快變得痛苦。 如果需要,粘貼您的代碼,然後它可能會更容易幫助 – spotman

+0

@spotman,感謝您的評論。基本上,我的代碼在這裏不會很有用,因爲它太籠統了。像'Item'(例如)與user_id的10個模型,可由其他用戶管理。這樣用id爲1的用戶可以編輯Itme.first.user_id(#=> 2)。我需要觀察者觀察一些東西,比如(User1更新由User2創建的Item1)。而且,是的,通過網絡服務器進行限制對我來說完全可以。 –

+0

那麼你想用這些數據做什麼?如果你試圖做一些事情,比如發送電子郵件給做更新的人,如果你把它放在控制器中,通常會更容易維護,特別是當你試圖避免使用attr_accessor來設置類似updater_id的東西時,在觀察員閱讀。 – spotman

回答

1

經過調查瞭解更多,我發現在這樣的任務中使用Rails本地觀察者完全沒用,因爲如果你需要傳遞控制器的東西,它是current_user,這完全毀了觀察者的美麗。

所以我對自己的問題的回答是:仍然堅持像acts_as_audited

0

我的建議是將last_modification_by字段添加到您的模型中。在你的觀察者中,你可以用它來確定誰做出了改變,誰得到通知。

然後讓您的視圖/控制器代碼將當前用戶放在該字段中。

這對我來說似乎是最安全的方法。我擔心使用當前用戶的觀察者 - 我感覺當前用戶應該與觀察者正在做的準背景處理脫離。 (這就是爲什麼在一個線程中存儲當前用戶的原因 - 我在過去取得的巨大成功 - 這裏也感覺不對)。

這種方法(使用last_modified_by也可以批量修改記錄 - 可能發送電子郵件給記錄所有者)系統已更新記錄,因爲(某些日常處理例程發生了)last_modified_by某些已創建用戶代表系統(或管理員用戶)