使用paper_trail gem创建审计跟踪

时间:2013-09-20 20:33:55

标签: ruby-on-rails ruby audit-trail paper-trail-gem

我对rails非常陌生,并且使用paper_trail gem是全新的。

我想显示每个对我的资产模型的位置或标记号所做的更改的列表。我已经安装了paper_trail,它似乎正常工作。在我看来,我有这个:

<% @asset.versions.order('created_at DESC').each do |version| %>
    On <%= version.created_at %> <%= version.whodunnit %> updated this asset.<br>
    <ul>
        <li>Asset relocated from "<%= version.last.locaton %>" to "<%= version.location %> "</li>
        <li>User changed from "<%= version.last.tag_number %>" to "<%= version.tag_number %> "</li>
    </ul>
<% end %>

这给了我关于何时进行更改以及由谁创建的正确信息,但我无法确定显示说明的行(例如):资产从“223”重新定位到“258”或“标签号”已从“1173”至“1175”。

理想情况下,我只会显示已更改内容的信息。因此,如果位置发生变化但标签号没有变化,我只会显示位置线。

我甚至不知道从哪里开始。任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

来自PaperTrail文档: PaperTrail有一个可选的表列,可在创建名为object_changes的版本时使用。这将存储 ONLY 版本之间所做的更改。这将允许您只显示每个版本之间的更改。它的工作原理如下。

>> widget = Widget.create :name => 'Bob'
>> widget.versions.last.changeset                # {'name' => [nil, 'Bob']}
>> widget.update_attributes :name => 'Robert'
>> widget.versions.last.changeset                # {'name' => ['Bob', 'Robert']}
>> widget.destroy
>> widget.versions.last.changeset                # {}

如果您最近将paper_trail添加到模型中,则可以运行迁移以添加此列。这将跟踪未来的变化。

class AddObjectChangesColumnToVersions < ActiveRecord::Migration
  def self.up
    add_column :versions, :object_changes, :text
  end

  def self.down
    remove_column :versions, :object_changes
  end
end

我最近需要进行更改,但是,我们拥有20多个模型的多年版本数据,并补充说迁移只会在将来有所帮助,而不会在过去给我所有数据更改。

我最后为PaperTrail创建了一个补丁,添加了diff_previousdiff_nextdiff_live等方法,这些方法可以让我区分不同的版本。它是基于这个paper_trail(https://github.com/jeremyw/paper_trail/blob/master/lib/paper_trail/has_paper_trail.rb#L151-L156)补丁的想法,但我实现它完全不同。如果你想了解更多细节,我会看看我是否可以开源补丁。