创建新用户时如何为 paper_trail 设置 whodunnit?

How to set whodunnit for paper_trail when creating a new user?

paper_trail gem 跟踪版本,做得很好。但是,我一直注意到一种极端情况。对于大多数对象,如果您已登录,应用程序控制器会设置 whodunnit,然后在该会话期间创建的所有对象都有一个根据登录者记录 "whodunnit" 的版本。

有趣的情况是没有人登录,因为新用户正在注册。用户是用 "nil" whodunnit 创建的,这是错误的,因为实际上用户是他们自己创建的。

当然,whodunnit在保存用户记录之前是无法知道用户id的。这个我知道。

但是,这稍后会产生冲突,因为各种批处理作业也会修改用户记录,并且不在网络会话中,也会创建没有 whodunnit 记录的版本。

现在我无法分辨是谁创建了用户 - 一些批量导入过程,还是用户。

我正在考虑各种解决方案,比如可能在 Papertrail::Versions table 中翻找那个对象并修复 whodunnit,但这似乎很不干净。

有什么建议吗?

您可以在控制器的创建操作中强制 whodunnit。

before_filter :only => [:create] do
  PaperTrail.whodunnit = "Public User"
end

如果你坚持使用table版本的用户id,你可以这样做:

ActiveRecord::Base.transaction do
  @user.save!
  @user.versions.last.update_attributes!(:whodunnit => @user.id)
end