ruby-on-rails - 我可以使用 papertrail 存储 "pending-approval"更改吗?

标签 ruby-on-rails versioning paper-trail-gem

我需要允许权限较低的用户提出对记录的更改,但让他们坐在某个地方,直到管理员批准他们。它应该类似于 Stack Overflow 允许声誉较低的用户对必须由声誉较高的人审查的问题或答案提出编辑建议的方式。

用纸迹术语来说,我希望允许用户创建记录的版本,而无需实际将这些更改提交给记录本身—— future 版本,而不是过去的版本。然后我想允许另一个用户“恢复”(“prevert”?)到新版本。

这是papertrail支持的东西吗?或者有没有其他 gem 可以做到这一点?

最佳答案

我知道这个问题很老了,但让我解释一下我是如何解决它的:

假设我有一个模型 Post ,两个用户:AB ,那 A有权更新帖子,但他需要 B在提交更改之前获得批准,B是可以批准更新并可以更新帖子的监视器。

  • 我添加了一个方法来将记录恢复到它的特定版本,这样我们就可以用我们想要的任何版本更新它:

  • 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[1]] }.to_h
        self.update_attributes(changes)
    end
    

    我从这个 Stackoverflow answer 得到了那个方法但我稍微修改了一下。
  • 诀窍是不是 如果当前用户 A 更新记录本身未授权提交更改而不是更新新 纸迹 将创建版本,然后监视器 B可以通过将原始记录恢复到该版本来接受新的更改。

  • 为此,我使用了 中的函数纸迹 核心paper_trail.record_update() .

    答:

    p = Post.find(1)
    p.title = "A new pending version"
    p.paper_trail.record_update(nil)
    

    B 作为监视器:

    p = Publication.find(1)
    p.revert_to(p.versions.last)
    

    B作为编辑:

    p = Publication.find(1)
    p.title = "p will be updated to this version immediately"
    p.paper_trail.record_update(nil)
    p.save
    
  • 我加了 has_paper_trail发布模型,但我将其限制在创建和销毁操作上,因为正如我上面所说,我不希望在更新后创建新版本,我希望在之前创建它。

  • has_paper_trail :on => [:create, :destroy]
    

    关于ruby-on-rails - 我可以使用 papertrail 存储 "pending-approval"更改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22000654/

    相关文章:

    ruby-on-rails - 我应该将 SQL 查询放在 Rails 的什么位置?

    ruby-on-rails - 等待 popen3 进程完成?

    ruby-on-rails - Heroku & Delayed Job & Workless - RestClient::ResourceNotFound

    versioning - 在 Dart with Pub 中,我什么时候应该对依赖项使用 "any"版本约束?

    java - 带有子资源定位器的 Jersey 版本控制

    html - 如何使用原始 html 显示内容

    versioning - 全面的新手版本控制

    ruby-on-rails-4 - 为添加该字段之前创建的行填充 object_changes 字段

    logging - 浏览器中的 Logstash 日志尾部

    ruby-on-rails - 使用 PaperTrail,我可以为特定模型或属性选择退出 `object_changes` 吗?