gpt4 book ai didi

ruby-on-rails - Paper_trail gem 技能

转载 作者:行者123 更新时间:2023-12-04 03:41:34 25 4
gpt4 key购买 nike

我想知道是否可以使用 papertrail 实现以下用例 gem ?
维基百科类型的应用程序,其 wiki 页面登录的用户可以更改/编辑,其中:

  • 版主可以撤消特定更改:
    我知道 papertrail 允许回滚到以前的版本,但我在这里问的有点不同。也就是说,撤消特定编辑/更改的能力。假设一个记录/wiki 页面有三个编辑/版本。然后,如果您想撤消编辑 2,则编辑 1 和 3 的更改仍应保留。但是,如果您要回滚到编辑 2 之前的版本,那么编辑 3 也将被撤消,这不是我想要的。
  • 用户所做的更改(贡献)反馈到用户的个人资料中,然后将概述该用户所做的更改/贡献:

    我相信这可以使用 --with-changes选项(它注册除了更改资源的完整转储之外所做的更改)与 papertrail 注册已进行更改的用户这一事实相结合。我的理解正确吗?

    在教程http://samurails.com/gems/papertrail/我阅读了有关将 papertrail 与 gem diffy 结合使用的信息确定确切更改了什么,但我不明白为什么教程使用 diffy当 papertrail 本身已经提供了“差异化”功能时?
  • 要让版主在实际实现更改之前(即实际应用更改之前)首先接受某些用户的更改:

    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.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.用户所做的更改(贡献)

    要打开更改跟踪,请将以下方法添加到您的应用程序 Controller :
    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或任何类似的图书馆。

    版主接受更改

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

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

    关于ruby-on-rails - Paper_trail gem 技能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32348047/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com