【发布时间】:2014-05-22 09:47:04
【问题描述】:
我有一个带有大量模型的 Rails 3 应用程序。此外,我还有大量的 rake 任务等等。至少我有必要检查我的数据库中的所有更改。每次记录更改时,我都必须知道哪一行脚本进行了更改。
我曾经使用 audited-gem,这很好,但没有回答更改的发起者,这让我很伤心。我真的坚持这一点。
【问题讨论】:
标签: ruby-on-rails ruby acts-as-audited
我有一个带有大量模型的 Rails 3 应用程序。此外,我还有大量的 rake 任务等等。至少我有必要检查我的数据库中的所有更改。每次记录更改时,我都必须知道哪一行脚本进行了更改。
我曾经使用 audited-gem,这很好,但没有回答更改的发起者,这让我很伤心。我真的坚持这一点。
【问题讨论】:
标签: ruby-on-rails ruby acts-as-audited
我们为此使用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,但它有效:)
【讨论】:
caller 对象,例如caller[0] 以获取调用该方法的代码行。但是,这通常很困难,因为caller 是堆栈跟踪,并且您的 rake 任务可能与acts_as_audited 方法相距很多步。我想您可以查看caller 并在您的“lib/tasks”文件夹中查找第一个文件。
不确定你提到的宝石是如何工作的。 Papertrail 使用控制器和 current_user 变量记录谁更改了数据。查看他们的 Github 页面。
【讨论】: