PaperTrail:在控制器上下文之外的info_for_paper_trail

我正在使用paper_trail gem来对我的模型进行版本控制。

到目前为止,我的模型依赖于ApplicationControllerinfo_for_paper_trail方法:

 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的虚拟属性并将proc传递给has_paper_trail ,但是错误的method not foundexception的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 ,而且我不喜欢这个解决方案如何闻起来……

如果您在控制器外部操作,则需要在代码中设置这些值:

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

然后,模型将选择额外的值,就像通常从控制器那样。

我从查看PaperTrail::Controller模块中获取了这些信息。 特别是,请查看以前filter运行的set_paper_trail_controller_infoset_paper_trail_whodunnit方法。

我想你可以做到:

 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