我想知道是否可以使用平铺 gem实现以下用例?具有登录用户的wiki页面的Wikipedia类型的应用程序可以更改/编辑该应用程序的位置:
--with-changes选项(它注册除了已更改的资源的全部转储之外所做的更改)以及书面记录注册了已经更改的用户这一事实是可能的。我的理解正确吗?
在教程http://samurails.com/gems/papertrail/中,我读到了关于如何结合使用纸质信息和创业板diffy来确定更改的内容,但我不理解的是为什么教程使用diffy,因为纸质文档本身已经提供了“差异”功能?发布于 2015-09-02 08:53:22
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.versions.count
assert_equal 'My Article 3', article.title # title haven't changed
assert_equal 'first version', article.body # body did change
end
end2.用户所作的改变(贡献)
若要打开更改跟踪,请向应用程序控制器添加以下方法:
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或任何类似的库。
版主接受更改
我不认为在一个单独的领域中实现它是容易的。对于“接受”和“原始”数据,您可能需要有两个列,甚至可能是两个不同的模型。
我想我已经回答了你所有的问题,这对你很有帮助。
https://stackoverflow.com/questions/32348047
复制相似问题