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

时间:2014-01-13 11:46:50

标签: ruby-on-rails ruby

我目前正在尝试为用户实施简单审核(仅适用于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

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

2 个答案:

答案 0 :(得分: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耦合

答案 1 :(得分: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