ruby-on-rails – Paper_trail宝石的能力
我想知道使用
papertrail gem可以实现以下用例吗?
维基百科类型的应用程序,其中包含登录用户的Wiki页面,可以更改/编辑以及在何处: >版主可以撤消具体更改: 我相信这可以使用–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或任何类似的库. 主持人接受更改 我认为在单一领域实施起来并不容易.您可能需要有两列“已接受”和“原始”数据,甚至可能有两个不同的模型. 我想我已经涵盖了你所有的问题,这对你很有帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 克努特 - 莫里斯 - 普拉特算法的C语言实现
- React Native系列之-React.js介绍
- MongoDB初学者最常用的10个命令
- ruby-on-rails – 使用Sublime Text 3突出显示的HTML背景语
- [Swift,Alamofire]:responseValidationFailed,错误代码为4
- 正则表达式(靓号过滤)
- Flex样式-PopUpButton篇
- 代表必须响应locationManager:didUpdateLocations swift e
- cocos2d-x游戏实例(20)-纵版射击游戏(7)
- ios – Xcode 5 – 如何添加标题搜索路径并使用GDataXMLNod