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

Chr*_*ers 4 versioning ruby-on-rails delayed-job ruby-on-rails-3 paper-trail-gem

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

到目前为止,我的模型取决于以下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
Run Code Online (Sandbox Code Playgroud)

这在控制器的上下文中效果很好,但是有没有办法我可以在控制器的上下文之外复制这种东西(例如,延迟的工作)?

我试图创建一个名为虚拟属性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!
Run Code Online (Sandbox Code Playgroud)

我基于此结果假定meta不能取proc,并且我也不喜欢这种解决方案的气味...

Chr*_*ers 5

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

::PaperTrail.controller_info = { revision_id: revision.id, revision_source_id: revision_source.id }
::PaperTrail.whodunnit = user.id
Run Code Online (Sandbox Code Playgroud)

然后,模型将像正常情况下从控制器中拾取额外的值。

我从查看PaperTrail::Controller模块中获得了此信息。特别是,请查看与之前的过滤器一样运行的set_paper_trail_controller_infoset_paper_trail_whodunnit方法。