4

我正在使用paper_trail gem來對我的模型進行版本控制。PaperTrail:控制器上下文外的info_for_paper_trail

到目前爲止,我的模型依賴於info_for_paper_trail方法ApplicationController

class ApplicationController < ActionController::Base 
    # Extra columns to store along with PaperTrail `versions` 
    def info_for_paper_trail 
    { revision_id: @revision.id, revision_source_id: @revision_source.id } 
    end 
end 

這工作在控制器的背景很大,但沒有辦法,我可以複製這樣的事情的範圍之外的方式的控制器(例如,延遲工作)?

我試圖創建一個虛擬屬性,叫做revision和傳遞prochas_paper_trail,但它具有method not found異常錯誤了:

# Attempt to solve this in the model 
class Resource < ActiveRecord::Base 
    # Virtual attribute 
    attr_accessor :revision 

    # Attempt to use virtual attribute only if set from delayed job 
    has_paper_trail meta: proc { |resource| resource.revision.present? ? { revision_id: resource.revision.id, revision_source_id: revision.revision_source.id } : {} } 
end 

# Gist of what I'm trying to do in the delayed job 
resource = Resource.new 
resource.revision = Revision.new(user: user, revision_source: revision_source) 
resource.save! 

我想基於這個結果meta不能採取proc,和加上我不喜歡這個解決方案如何聞起來......

回答

4

如果您在控制器之外操作,您需要在代碼中設置這些值:

::PaperTrail.controller_info = { revision_id: revision.id, revision_source_id: revision_source.id } 
::PaperTrail.whodunnit = user.id 

該模型將選擇額外的值,就像它通常從控制器中獲取一樣。

我從查看PaperTrail::Controller模塊獲得此信息。特別是,請查看與以前的過濾器一樣運行的set_paper_trail_controller_infoset_paper_trail_whodunnit方法。

0

我認爲你可以這樣做:

class Resource < ActiveRecord::Base 
    # Virtual attribute 
    attr_accessor :revision, :revision_source 

    # Attempt to use virtual attribute only if set from delayed job 
    has_paper_trail meta: { 
    revision_id: :get_revision_id, 
    revision_source_id: get_revision_source.id 
    } 

    def get_revision_id 
    resource.revision.try(:id) 
    end 

    def get_revision_source_id 
    resource.revision_source.try(:id) 
    end 
end