6

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

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

这是 papertrail 支持的东西吗?还是有其他宝石可以做到这一点?

4

2 回答 2

7

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

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

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

  1. 诀窍是如果当前用户未授权提交更改,则不更新记录本身,而不是更新,将创建一个新的Paper Trail版本,然后监视器可以通过将原始记录恢复到该版本来接受新的更改.AB

为此,我使用了Paper Trail core中的一个函数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 模型,但我将它限制在创建和销毁操作上,因为正如我上面所说,我不希望在更新后创建新版本,我希望在之前创建它。
has_paper_trail :on => [:create, :destroy]
于 2017-02-15T17:37:26.363 回答
2

我现在面临同样的问题。

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

这不是最干净的解决方案,但它应该可以工作。我们还可以将其他属性添加到您的 Record 模型中,例如approved_byand approved_at,如果您是我们的话。

嗯。。我在考虑。。

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

于 2014-05-31T11:42:01.453 回答