首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Paper_trail宝石能力

Paper_trail宝石能力
EN

Stack Overflow用户
提问于 2015-09-02 08:21:10
回答 1查看 663关注 0票数 4

我想知道是否可以使用平铺 gem实现以下用例?具有登录用户的wiki页面的Wikipedia类型的应用程序可以更改/编辑该应用程序的位置:

  1. 主持人可以撤销特定的更改: 我理解书面记录允许回滚到以前的版本,但我在这里要求的是有点不同。也就是说,撤销特定编辑/更改的能力。假设一个记录/wiki页面有三个编辑/版本。然后,如果您想要撤消编辑2,那么从编辑1和3的更改仍然应该保持。但是如果在编辑2之前回滚到版本,那么编辑3也会被撤销,这不是我想要的。
  2. 用户所做的更改(贡献)反馈到用户的配置文件中,然后用户将对该用户所做的更改/贡献进行概述: 我相信,使用--with-changes选项(它注册除了已更改的资源的全部转储之外所做的更改)以及书面记录注册了已经更改的用户这一事实是可能的。我的理解正确吗? 在教程http://samurails.com/gems/papertrail/中,我读到了关于如何结合使用纸质信息和创业板diffy来确定更改的内容,但我不理解的是为什么教程使用diffy,因为纸质文档本身已经提供了“差异”功能?
  3. 要让版主首先接受某些用户的更改,则在该更改实际实施之前(即在实际应用更改之前): 书面记录也能帮助实现这一功能吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-02 08:53:22

1.主持人可以撤销特定的更改

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

代码语言:javascript
复制
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数组,它排除了不应该恢复的多个系统字段。

我们可以很容易地测试这个模块。让我们创建一个表:

代码语言:javascript
复制
create_table :articles do |t|
  t.string :title
  t.string :body

  t.timestamps null: false
end

和相关模式:

代码语言:javascript
复制
class Article < ActiveRecord::Base
  include Revertible
  has_paper_trail
end

下面的测试用例显示,只恢复了版本特定的编辑:

代码语言:javascript
复制
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.versions.count
    assert_equal 'My Article 3', article.title # title haven't changed
    assert_equal 'first version', article.body # body did change
  end
end

2.用户所作的改变(贡献)

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

代码语言:javascript
复制
class ApplicationController
  def user_for_paper_trail
    user = current_user
    return 'public' if user.blank?
    user.username
  end
end

现在可以很容易地跟踪特定用户所做的更改:

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

差异化

至于你关于diffy的问题。如果您只需要了解相邻的两个版本之间的差异,那么您实际上并不需要它。但是,如果需要比较由几个编辑分隔的版本之间的更改,则确实需要diffy或任何类似的库。

版主接受更改

我不认为在一个单独的领域中实现它是容易的。对于“接受”和“原始”数据,您可能需要有两个列,甚至可能是两个不同的模型。

我想我已经回答了你所有的问题,这对你很有帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32348047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档