PaperTrail:控制器上下文之外的info_for_paper_trail [英] PaperTrail: info_for_paper_trail outside the context of a controller

查看:115
本文介绍了PaperTrail:控制器上下文之外的info_for_paper_trail的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 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_infoset_paper_trail_whodunnit方法.

这篇关于PaperTrail:控制器上下文之外的info_for_paper_trail的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆