【发布时间】:2016-01-30 08:11:56
【问题描述】:
在我的 Rails 4 应用程序中,我使用 paper_trail 来跟踪用户对 Post 模型记录所做的更改:
# post.rb
has_paper_trail :on => [:update, :destroy]
一个postbelong_to一个calendar和一个calendarhas_manypost,所以我在位于calendarindex视图的仪表板中显示对帖子所做的更改:
<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 属性,我不能 ignore 和 @ 987654341@因为我还想知道帖子什么时候更新?
————
更新 3:在this Stack Overflow thread,@Maysam 建议:
启用此行为后,很容易获得
object.versions.map{|v| [v.created_at, v.changeset]}然后 迭代该结构以呈现您的更改日志。
我不确定我是否理解在我的案例中如何实际迭代该结构:有什么建议吗?
————
我真的可以用 paper_trail 实现吗?
【问题讨论】:
-
请尽量缩短这个问题,以便对其他人更有用。谢谢!
-
我很乐意这样做,但要在长度方面找到适当的平衡并不容易,因为当我尝试发布简短的问题时,经常被要求提供更多代码。
标签: ruby-on-rails ruby-on-rails-4 versioning records paper-trail-gem