我可以使用papertrail存储“待批准”更改吗?

时间:2014-02-24 22:38:22

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

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

在papertrail术语中,我想允许用户创建记录版本而不实际将这些更改提交到记录本身 - 未来版本,而不是过去的版本。那我想让其他用户“恢复”(“预翻”?)到新版本。

这是papertrail支持的吗?或者是否有其他宝石可以做到这一点?

2 个答案:

答案 0 :(得分:3)

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

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

  1. 我添加了一种方法将记录恢复到特定版本,以便我们可以使用我们想要的任何版本更新它:
  2. 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获得了这个方法,但我对它进行了一些修改。

    1. 如果当前用户A未授权更改而不是更新新的 Paper Trail 不更新记录本身>将创建版本,然后监视器B可以通过将原始记录还原到该版本来接受新的更改。
    2. 为此,我使用了 Paper Trail 核心paper_trail.record_update()中的一个功能。

      <强> A:

      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
      
      1. 我将has_paper_trail添加到Post模型,但我将其限制在创建和销毁操作上,因为正如我上面所说的,我不希望在更新后创建新版本,我希望它之前创建。 / LI>
        has_paper_trail :on => [:create, :destroy]
        

答案 1 :(得分:1)

我现在面临同样的问题。

不,paper_trail不支持它,但也许我们可以在记录中添加approved属性。它应该默认为false,以便在保存Record对象时创建一个新的paper_trail版本,该属性设置为false。 稍后,AdminUser可以将记录设置approved批准为true,paper_trail将创建新的批准版本。

它不是最干净的解决方案,但应该有效。我们还可以为您的记录模型添加其他属性,例如approved_byapproved_at

嗯......我正在考虑它..

如果您找到了更好的解决方案,请告诉我们!