2014-02-24 37 views
4

我需要允許權限較低的用戶對記錄提出更改建議,但讓他們坐在某個位置,直到管理員批准爲止。它應該與Stack Overflow允許信譽較低的用戶提出編輯問題或答案相似,必須由具有較高聲譽的人審閱。我可以使用papertrail存儲「待批准」更改嗎?

在附屬條款中,我想允許用戶創建記錄的版本,而不實際將這些更改提交給記錄本身 - 將來的版本,而不是過去的版本。然後,我想允許另一個用戶「恢復」(「prevert」?)到新版本。

這是papertrail支持的東西嗎?還是有另一個可以做到這一點的寶石?

回答

1

我現在面臨同樣的問題。

不,它不受paper_trail支持,但也許我們可以實現它爲我們的記錄添加approved屬性。它應該默認爲false,以便在保存Record對象時創建一個新的paper_trail版本,並將該屬性設置爲false。 稍後AdminUser可以批准記錄設置approved爲true,paper_trail將創建新的批准版本。

這不是最乾淨的解決方案,但它應該工作。而且我們還可以將其他屬性添加到您的Record模型中,例如approved_byapproved_at,如果我們是他們的話。

嗯..我想它..

請讓我知道如果你找到了更好的解決方案!

2

我知道這個問題已經很老了,但讓我解釋一下我是如何設法解決它:

假設我有一個模型Post,兩個用戶:AB,即A被授權更新的帖子,但在提交更改之前他需要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 answer但我修改它有點。

  • 訣竅是更新記錄本身如果當前用戶A尚未授權提交改變,而不是更新,新的紙徑版本將創建,那麼監視器B可以通過將原始記錄還原爲該版本來接受新更改。
  • 因我從紙徑核心paper_trail.record_update()使用的功能。

    答:

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

    乙作爲監視器:

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

    乙作爲一個編輯:

    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] 
    
    相關問題