-1

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

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

4

2 回答 2

0

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

于 2014-05-22T09:49:57.723 回答
0

我们为此使用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,但它有效:)

于 2014-05-22T10:15:19.460 回答