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

2023-12-22

我正在使用纸迹 https://github.com/airblade/paper_trailgem 用于对我的模型进行版本控制。

到目前为止,我的模型取决于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并通过一个proc into has_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,而且我也不喜欢这个解决方案的味道......


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

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

然后,模型将像通常从控制器中一样选取额外的值。

我通过查看此信息得出PaperTrail::Controller https://github.com/airblade/paper_trail/blob/9da4930ab5d786c5fb8fec33a0d270eed1b2ca55/lib/paper_trail/controller.rb模块。特别是,看看set_paper_trail_controller_info and set_paper_trail_whodunnit像以前的过滤器一样运行的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐