如何解决Papertrail:日志中没有 whodunnit 值和 object_changes 的记录
我已将 papertrail 设置为仅记录包含 whodunnit 值的更改/当管理员通过在我的模型中使用以下条件进行更改时:
has_paper_trail if: proc { |model| PaperTrail.request.whodunnit.present? }
但是我注意到仍然有相当数量的记录被存储为空的 whodunnit 值。从查看记录来看,这些似乎主要是“更新”操作,由于某种原因,所有对象都发生了变化。我不确定为什么该值是空的,或者考虑到上述条件如何保存它。
我使用以下方法从应用程序控制器中的管理员那里获取 whodunnit 值:
def user_for_paper_trail
request.env['warden']&.user(:admin)&.id
end
有没有人遇到过类似的行为?
解决方法
将 source_location
和 command
字段添加到您的 papertrail 版本表将帮助您:
- 跟踪是什么命令导致
nil
whodunnit 更改。 - 确保您正确记录由 rake 任务 或 rails 控制台发起的更改。
为此,请创建迁移以将 source_location
和 command
字段添加到您的版本表:
class AddSourceLocationAndCommandToVersions < ActiveRecord::Migration
def change
add_column :versions,:source_location,:text
add_column :versions,:command,:text
end
end
我在 papertrail.rb
中设置了以下内容。我正在使用 JSON serializer
但这些更改可能适用于普通序列化程序。 serializer
声明后面的代码是您感兴趣的:
require "paper_trail/frameworks/rails"
require "paper_trail"
# the following line is required for PaperTrail >= 4.0.0 with Rails
PaperTrail::Rails::Engine.eager_load!
PaperTrail.config.enabled = true
PaperTrail.serializer = PaperTrail::Serializers::JSON
# Store some metadata about where the change came from,even for rake tasks,etc.
# See: https://github.com/paper-trail-gem/paper_trail/wiki/Setting-whodunnit-in-the-rails-console
def PaperTrail.set_global_metadata
request.controller_info ||= {}
request.controller_info[:command] ||= "#{File.basename($PROGRAM_NAME)} #{ARGV.join ' '} (#{$PID})"
request.controller_info[:source_location] = caller.find { |line|
line.starts_with? Rails.root.to_s and
!line.starts_with? __FILE__
}
end
# Defer evaluation in case we're using spring loader (otherwise it would be something like "spring app | app | started 13 secs ago | development")
# There's no way to set up deferred evaluation of PaperTrail.request.controller_info from here like
# we can with whodunnit,so abuse that property of PaperTrail.request.whodunnit to set other
# metadata. Reserve the whodunnit field for storing the actual name or id of the human who made the
# change.
PaperTrail.request.whodunnit = ->() {
PaperTrail.set_global_metadata
if Rails.const_defined?("Console") || $rails_rake_task
"#{`whoami`.strip}: console"
else
"#{`whoami`.strip}: #{File.basename($PROGRAM_NAME)} #{ARGV.join ' '}"
end
}
Rails.application.configure do
console do
PaperTrail.request.controller_info = { command: "rails console" }
PaperTrail.request.whodunnit = ->() {
PaperTrail.set_global_metadata
@paper_trail_whodunnit ||= (
if Rails.const_defined?("Console") || $rails_rake_task
"#{`whoami`.strip}: console"
else
"#{`whoami`.strip}: #{File.basename($PROGRAM_NAME)} #{ARGV.join ' '}"
end
)
}
end
end
请注意,在请求之外发生记录创建的任何地方,如果您不希望它为空,您可以手动将 whodunnit
值设置为特定的值。例如。在我的种子文件中,我执行以下操作:
class SeedCreator
def initialize
PaperTrail.request.whodunnit = ->() {
PaperTrail.set_global_metadata # save source_location & command
"seed" # set whodunnit value to "seed"
}
create_campaign
create_users
# more seeding of models....
end
end
除了提高 Papertrail 表的质量(知道哪个命令触发了记录更新)之外,此配置还应帮助您确定幻像 whodunnits
的保存位置。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。