在我的Rails 4应用中,我使用paper_trail来跟踪用户对Post
模型记录所做的更改:
# post.rb
has_paper_trail :on => [:update, :destroy]
post
belong_to
一个calendar
和calendar
has_many
post
,因此我会在位于信息中心的信息中心中显示对帖子所做的更改在calendar
index
视图中:
<div id="my_changes">
<% if @versions.any? %>
<% @versions.each do |version| %>
<% version.reify ? post = version.reify : post = Post.find_by_id(version.item_id) %>
<p>
<strong>
<% if version.whodunnit.to_i === current_user.id %>
You
<% else %>
<%= User.find_by_id(version.whodunnit).first_name %>
<% end %>
</strong> <%= conjugate(version.event) %> the post "<%= post.subject %>" in the <em><%= link_to Calendar.find_by_id(post.calendar_id).name, calendar_path(id: post.calendar_id) %></em> calendar <span id="update_time_ago">— <%= time_ago_in_words(version.created_at) %> ago.</span></p>
<% end %>
<% else %>
<p>
<span class="glyphicon glyphicon-hand-up" aria-hidden="true"></span><br/>There is no change to your posts yet.<br/>
As soon as you update your calendar, a history of your changes will appear here.
</p>
<% end %>
</div>
这很好。
我现在想要实现的目标 - 我无法弄清楚如何 - 不仅要显示已更新的帖子,还要更新帖子的哪个属性及其值。
例如,而不是:
User_1更新了测试日历中的帖子“测试帖子” - 3天前。
我希望有类似的东西:
User_1更新日期/时间/主题/副本/ 帖子“测试” 在测试日历中发布“到NEW_POST_ATTRIBUTE_VALUE - 3天前。”
- - - -
更新:我确实阅读了paper_trail
的文档,特别是 Choose attributes to monitor 部分,但这似乎解释了如何实现我想要实现的目标。
- - - -
更新2 :我了解我正在寻找的内容实际上可以在文档的 Diffing versions 部分进行说明。
所以,我想在我的index.html.erb
视图中,我可以做类似的事情:
post.versions.last.changeset
但是,如何从那里提取我感兴趣的信息,例如:只有更新的属性及其新值,而不是updated_at
属性,我不能{{1因为我还想知道帖子何时更新,所以ignore
与paper_trail
一致。
- - - -
更新3 :在this Stack Overflow thread中,@ Mayays建议:
启用此行为后,获取相当简单
object.versions.map{|v| [v.created_at, v.changeset]}
然后 迭代该结构以呈现更改日志。
我不确定我是否理解如何在我的案例中实际迭代这个结构:任何建议?
- - - -
我可以用paper_trail实际实现吗?
答案 0 :(得分:1)
..我想..显示...帖子的哪个属性已更新及其值。
根据Diffing Versions的文档:
..来区分相邻版本..将
object_changes
文本列添加到versions
表中..PaperTrail将在每个更新版本中存储更改差异。您可以使用version.changeset
方法检索它。
所以,一旦你完成了,尝试添加
= debug post.versions.last.changeset
对你的看法。在那之后,在红宝石中if you know how to work with hashes,你应该好好去。