gpt4 book ai didi

ruby-on-rails - 纸迹 : records with nil whodunnit values and object_changes in logs

转载 作者:行者123 更新时间:2023-12-04 13:30:06 32 4
gpt4 key购买 nike

我已将 papertrail 设置为仅记录包含 whodunnit 值的更改/当管理员通过在我的模型中使用以下条件进行更改时:

has_paper_trail if: proc { |model| PaperTrail.request.whodunnit.present? }
但是我注意到仍然有相当数量的记录被存储为空的 whodunnit 值。从查看记录来看,这些似乎主要是“更新”操作,由于某种原因,所有的对象都发生了变化。我不确定为什么该值是空的,或者考虑到上述条件它会如何被保存。
我正在使用以下命令从我的应用程序 Controller 中的管理员那里获取 whodunnit 值:
def user_for_paper_trail
request.env['warden']&.user(:admin)&.id
end
有没有人遇到过类似的行为?

最佳答案

添加 source_locationcommand您的 Papertrail 版本表中的字段将帮助您:

  • 跟踪导致 nil 的命令谁不知道改变。
  • 确保您正确记录由 发起的更改 rake 任务 rails 控制台 .

  • 为此,请创建迁移以添加 source_locationcommand字段到您的版本表:

    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 的位置。正在被拯救。

    关于ruby-on-rails - 纸迹 : records with nil whodunnit values and object_changes in logs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65563549/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com