【问题标题】:Rails 4 x paper_trail: track which attributes are updated and display their new valueRails 4 x paper_trail:跟踪更新了哪些属性并显示它们的新值
【发布时间】: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


【解决方案1】:

..我想..显示..帖子的哪个属性已更新及其值。

根据Diffing Versions 上的文档:

.. 区分相邻版本.. 将object_changes 文本列添加到您的versions 表.. PaperTrail 将存储更改差异.. 在每个更新版本中。您可以使用version.changeset 方法来检索它。

所以,一旦你完成了,尝试添加

= debug post.versions.last.changeset

在你看来。在那之后,if you know how to work with hashes 在 ruby​​ 中,你应该很高兴。

【讨论】:

  • 谢谢。这就是我现在的位置。我试图找出一种方法来处理用户编辑一个属性、多个属性等的不同场景。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多