2014-01-13 68 views
1

我正在嘗試爲用戶實施簡單的審計(僅適用於銷燬方法)。這樣我知道用戶是否已被管理員刪除或用戶刪除了自己。我想將deleted_by_id列添加到我的模型中。在模型方法中使用Rails中的當前用戶

我想用before_destroy,並檢索像在這篇文章中描述的用戶信息:

http://www.zorched.net/2007/05/29/making-session-data-available-to-models-in-ruby-on-rails/

module UserInfo 
    def current_user 
    Thread.current[:user] 
    end 

    def self.current_user=(user) 
    Thread.current[:user] = user 
    end 
end 

但這篇文章是從2007年,我不知道將這項工作在多線程中,是否還有更多關於這個主題的最新信息,有沒有人最近做過類似的事情來傳遞經驗?

回答

6

使用這種技術肯定會工作,但會違反要模型不知道控制器狀態的原則。

如果您需要知道誰負責刪除,正確的方法是傳遞參數等信息。

而不是使用回調和線程(均表示沒有必要在這種情況下的複雜性)簡單地在模型中定義一個新的方法

class User 
    def delete_user(actor) 
    self.deleted_by_id = actor.id 
    # do what you need to do with the record 
    # such as .destroy or whatever 
    end 
end 
在你的控制器

然後只需撥打

@user.delete_user(current_user) 

這種方法:

  1. 尊重MVC模式
  2. 可以與最小的相關隔離容易地測試(這是一個模型的方法)
  3. 暴露定製的API,而不是應用程式耦合到ActiveRecord的API
0

您可以使用paranoia gem進行軟刪除。然後我建議通過某種服務來摧毀用戶。檢查,真的基本示例如下:

class UserDestroyService 
    def initialize(user, destroyer) 
    @user = user 
    @destroyer = destroyer 
    end 

    def perform 
    @user.deleted_by_id = @destroyer.id 
    @user.destroy 
    end 
end 

UserDestroyService.new(user, current_user).perform 
相關問題