加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Paper_trail宝石的能力

发布时间:2020-12-17 02:24:45 所属栏目:百科 来源:网络整理
导读:我想知道使用 papertrail gem可以实现以下用例吗? 维基百科类型的应用程序,其中包含登录用户的Wiki页面,可以更改/编辑以及在何处: 版主可以撤消具体更改: 我理解papertrail允许回滚到以前的版本,但我在这里问的是有些不同.也就是说,撤消特定编辑/更改的能
我想知道使用 papertrail gem可以实现以下用例吗?
维基百科类型的应用程序,其中包含登录用户的Wiki页面,可以更改/编辑以及在何处:

>版主可以撤消具体更改:
我理解papertrail允许回滚到以前的版本,但我在这里问的是有些不同.也就是说,撤消特定编辑/更改的能力.假设记录/维基页面有三个编辑/版本.然后,如果要撤消编辑2,则仍应保留编辑1和3的更改.但是如果你在编辑2之前回滚到版本,那么编辑3也会被撤消,这不是我想要的.
>用户的更改(贡献)反馈到用户的配置文件中,然后概述该用户所做的更改/贡献:

我相信这可以使用–with-changes选项(它记录除了已更改资源的完全转储之外所做的更改)以及papertrail注册已进行更改的用户这一事实.我的理解是正确的吗?

在http://samurails.com/gems/papertrail/教程中,我读到了将papertrail与gem diffy结合使用以确定完全改变了什么,但我不明白为什么教程使用diffy时papertrail本身已经提供了“diffing”功能?
>要让某些用户首先接受更改,然后才能实际实施该更改(即,在实际应用更改之前):

papertrail还能帮助实现这一功能吗?

解决方法

1.版主可以撤消具体的更改

您可以使用以下模块实现此功能:

module Revertible
   SKIP_FIELDS = [ 'updated_at' ]

   def revert_to(version)
     raise 'not version of this model' unless self == version.item
     changes = version.changeset.select{ |k,v| not SKIP_FIELDS.include?(k) }.map{ |k,v| [k.to_sym,v[0]] }.to_h
     self.update_attributes(changes)
  end
end

它将revert_to方法添加到模型中,允许主持人仅撤消特定编辑中的更改.注意SKIP_FIELDS数组,它排除了几个不应该还原的系统字段.

我们可以轻松测试这个模块.让我们创建一个表:

create_table :articles do |t|
  t.string :title
  t.string :body

  t.timestamps null: false
end

和相关模型:

class Article < ActiveRecord::Base
  include Revertible
  has_paper_trail
end

以下测试用例显示,仅恢复了特定于版本的编辑:

class ArticleTest < ActiveSupport::TestCase
  test "rollback specific edit" do
    article = Article.create(title: 'My Article 1',body: 'first version')
    article.update_attributes(title: 'My Article 1',body: 'second version')
    article.update_attributes(title: 'My Article 3',body: 'third version')

    assert_equal 3,article.versions.count
    assert_equal 'My Article 3',article.title
    assert_equal 'third version',article.body

    article.revert_to article.versions[1]

    assert_equal 4,article.title # title haven't changed
    assert_equal 'first version',article.body # body did change
  end
end

2.由用户改变(贡献)

要打开更改跟踪,请将以下方法添加到应用程序控制器:

class ApplicationController
  def user_for_paper_trail
    user = current_user
    return 'public' if user.blank?
    user.username
  end
end

现在可以轻松跟踪特定用户所做的更改:

versions = PaperTrail::Version.where(whodunnit: 'dimakura')
version = versions.first
version.item # => #<Article id: 1,title: "...",body: "...">
version.event # => "create"
version.changeset

Diffy

至于你关于diffy的问题.如果您唯一需要的是在两个相邻版本之间获得差异,那么您实际上并不需要它.但是,如果您需要比较由多个编辑分隔的版本之间的更改,那么您确实需要diffy或任何类似的库.

主持人接受更改

我认为在单一领域实施起来并不容易.您可能需要有两列“已接受”和“原始”数据,甚至可能有两个不同的模型.

我想我已经涵盖了你所有的问题,这对你很有帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读