PaperTrail:控制器上下文之外的info_for_paper_trail [英] PaperTrail: info_for_paper_trail outside the context of a controller
问题描述
我正在使用 paper_trail gem来对模型进行版本控制.
I am using the paper_trail gem for versioning my models.
到目前为止,我的模型取决于ApplicationController
中的info_for_paper_trail
方法:
So far, my model depends on the info_for_paper_trail
method in 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
传递给has_paper_trail
,但是由于出现method not found
异常而出错:
I tried creating a virtual attribute called revision
and passing a proc
into has_paper_trail
, but it errors out with a 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
,而且我也不喜欢这种解决方案的气味...
I assume based on this result that meta
cannot take a proc
, and plus I don't like how this solution smells anyway...
推荐答案
如果在控制器外部进行操作,则需要在代码中设置以下值:
You need to set these values in your code if you're operating outside of the controller:
::PaperTrail.controller_info = { revision_id: revision.id, revision_source_id: revision_source.id }
::PaperTrail.whodunnit = user.id
然后模型将像通常从控制器中那样拾取额外的值.
The model will then pick the extra values up just like it would normally from the controller.
我通过查看 PaperTrail::Controller
模块.特别是,请查看像以前的过滤器一样运行的set_paper_trail_controller_info
和set_paper_trail_whodunnit
方法.
这篇关于PaperTrail:控制器上下文之外的info_for_paper_trail的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!