ruby-on-rails - 在模型方法中使用 Rails 中的当前用户

标签 ruby-on-rails ruby

我目前正在尝试为用户实现简单的审核(仅针对销毁方法)。这样我就知道用户是被管理员删除了还是用户自己删除了。我想将 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 年开始的,我不确定这篇文章是否可以在多线程中工作,是否有关于这个主题的最新信息,最近有没有人做过类似的事情来传递经验?

最佳答案

使用该技术当然可行,但会违反希望模型不知道 Controller 状态的原则。

如果您需要知道谁负责删除,正确的做法是将此类信息作为参数传递。

不要使用回调和线程(在这种情况下都代表不必要的复杂性),只需在您的模型中定义一个新方法

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

然后在你的 Controller 中调用

@user.delete_user(current_user)

这种方法:

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

关于ruby-on-rails - 在模型方法中使用 Rails 中的当前用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21090507/

相关文章:

ruby-on-rails - 结合 meta_search 与 acts_as_taggable_on

ruby-on-rails - 我是否正确使用工厂?

ruby - 使用 axlsx gem 向 Excel 工作表中的单元格添加注释

ruby-on-rails - 如何使用 Nokogiri 验证 XML?

ruby-on-rails - rescue_from block 中的 request.format

ruby-on-rails - rake 和 bin/rake 的区别

ruby - 使用 Feedzirra 检查更新的 RSS 提要

sql - Ruby 数组作为普通 SQL 查询的参数

Ruby 混淆使用 "colons"

ruby-on-rails - 在 Rails 中从数据库重新生成 YAML 装置