【问题标题】:Inspect who change a model rails 3检查谁更改模型 rails 3
【发布时间】:2014-05-22 09:47:04
【问题描述】:

我有一个带有大量模型的 Rails 3 应用程序。此外,我还有大量的 rake 任务等等。至少我有必要检查我的数据库中的所有更改。每次记录更改时,我都必须知道哪一行脚本进行了更改。

我曾经使用 audited-gem,这很好,但没有回答更改的发起者,这让我很伤心。我真的坚持这一点。

【问题讨论】:

    标签: ruby-on-rails ruby acts-as-audited


    【解决方案1】:

    我们为此使用acts_as_audited,现在它只是称为“已审核” -

    https://github.com/collectiveidea/audited

    正如您所说,这工作正常,但没有记录通过控制台或 rake 任务进行更改时进行更改的用户。因此,我想出了一个非常老套的解决方案(对我们来说效果很好,但可能取决于系统),用于在我们的生产服务器上记录用户。

    在我工作的公司,有两个 Rails 开发人员。我们是唯一一个通过 ssh 连接到我们的生产服务器的人,我们的公共 rsa 密钥存储在服务器上,地址为 ~/.ssh/authorized_keys

    当我打开 ssh 时,我的密钥被读取,我实际上可以做更多的事情,比如设置环境变量。因此,我们都修改了存储在服务器上的密钥,使其看起来像这样

    #mine
    environment="railsid=1182" ssh-rsa <keystring> <computer name>
    
    #my colleague's
    environment="railsid=1" ssh-rsa <keystring> <computer name>
    

    1182 和 1 是我们在系统上的用户记录的 id。这会将“railsid”的环境变量设置为“1182”或“1”,具体取决于我们中的哪个登录。(我们都以服务器上的同一用户身份登录 - 这是应用程序运行的用户因此,如果我们都使用它,权限等会更容易)

    然后我修改了acts_as_audited的代码:通常它获取当前登录的用户,如下所示:

    def set_audit_user
      if Thread.current[:acts_as_audited_user]
        self.user = Thread.current[:acts_as_audited_user] 
      end
      nil # prevent stopping callback chains
    end
    

    我的更改是查看是否没有当前用户,是否设置了该环境变量,如果设置了,则将其用作审核记录的用户:

    def set_audit_user
      if Thread.current[:acts_as_audited_user]
        self.user = Thread.current[:acts_as_audited_user] 
      elsif ENV['railsid'] && u = User.find_by_id(ENV['railsid'])
        self.user = u
      end
      nil # prevent stopping callback chains
    end
    

    我们已经使用acts_as_audited 很长时间了——我们将它安装为插件而不是gem,所以我在vendor/plugins/acts_as_audited/lib/acts_as_audited/audit.rb 中进行了这个更改

    如果您也想这样做,您将使用 gem 代替,因此您需要制作一个猴子补丁,例如在您的 lib 文件夹中。 (我有一个文件lib/gem_extensions.rb,我用它来做这样的事情)。

    就像我说的,这是超级hacky,但它有效:)

    【讨论】:

    • 太棒了!十分感谢!这不是解决脚本数量的问题,而是检查其中哪些更改了记录,而是解决了我的另一项任务。谢谢!
    • 我认为您需要更清楚地了解“每次记录更改时我必须知道哪一行脚本进行了更改”的要求。您是否只希望这作为 rake 任务的一部分发生?从理论上讲,您也可以查看acts_as_audited 中的caller 对象,例如caller[0] 以获取调用该方法的代码行。但是,这通常很困难,因为caller 是堆栈跟踪,并且您的 rake 任务可能与acts_as_audited 方法相距很多步。我想您可以查看caller 并在您的“lib/tasks”文件夹中查找第一个文件。
    【解决方案2】:

    不确定你提到的宝石是如何工作的。 Papertrail 使用控制器和 current_user 变量记录谁更改了数据。查看他们的 Github 页面。

    【讨论】:

    • 是的,经过审计的工作就像 Papertrail。它还保留一个current_user,但是当rake任务进行更改时它不起作用。
    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多