我正在使用 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
这在 Controller 的上下文中效果很好,但是有没有办法可以在 Controller 的上下文之外复制这种事情(例如,延迟的工作)?
我尝试创建一个名为
revision
的虚拟属性并通过 proc
进入 has_paper_trail
,但它会出现 method not found
错误异常(exception):# 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
,而且我不喜欢这个解决方案的味道......
最佳答案
如果您在 Controller 之外进行操作,则需要在代码中设置这些值:
::PaperTrail.controller_info = { revision_id: revision.id, revision_source_id: revision_source.id }
::PaperTrail.whodunnit = user.id
然后模型将像通常从 Controller 中一样选择额外的值。
我通过查看
PaperTrail::Controller
得出此信息模块。特别是看set_paper_trail_controller_info
和 set_paper_trail_whodunnit
像之前过滤器一样运行的方法。
关于ruby-on-rails - PaperTrail : info_for_paper_trail outside the context of a controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17970490/