在模型方法中使用Rails中的当前用户

Lon*_*don 1 ruby ruby-on-rails

我目前正在尝试为用户实现简单的审计(仅适用于destroy方法).这样我知道用户是否已被管理员删除或用户自行删除.我想在deleted_by_id我的模型中添加列.

我正在考虑使用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
Run Code Online (Sandbox Code Playgroud)

但是这篇文章是从2007年开始的,我不确定这会在多线程中工作吗?是否有关于这个主题的更新的内容,有没有人最近做过这样的事情来传递经验?

Sim*_*tti 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
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中简单地调用

@user.delete_user(current_user)
Run Code Online (Sandbox Code Playgroud)

这种方法:

  1. 尊重MVC模式
  2. 可以很容易地以最小的依赖关系进行测试(这是一种模型方法)
  3. 公开自定义API,而不是将您的应用程序耦合到ActiveRecord API