我目前正在尝试为用户实施简单审核(仅适用于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年开始的,我不确定这会在多线程中工作吗?是否有关于这个主题的更新的内容,是否有人最近做过这样的事情来传递经验?
答案 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 :(得分: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