创建新用户时如何为 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
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