【问题标题】:PaperTrail: info_for_paper_trail outside the context of a controllerPaperTrail:控制器上下文之外的 info_for_paper_trail
【发布时间】:2013-07-31 23:38:27
【问题描述】:

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

到目前为止,我的模型依赖于ApplicationController中的info_for_paper_trail方法:

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 异常:

# 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,而且我不喜欢这个解决方案的味道……

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 versioning delayed-job paper-trail-gem


    【解决方案1】:

    我认为你可以这样做:

    class Resource < ActiveRecord::Base
      # Virtual attribute
      attr_accessor :revision, :revision_source
    
      # Attempt to use virtual attribute only if set from delayed job
      has_paper_trail meta: { 
        revision_id: :get_revision_id, 
        revision_source_id: get_revision_source.id 
      }
    
      def get_revision_id
        resource.revision.try(:id)
      end
    
      def get_revision_source_id
        resource.revision_source.try(:id)
      end
    end
    

    【讨论】:

      【解决方案2】:

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

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

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

      我通过查看PaperTrail::Controller 模块得出了这些信息。特别是,查看 set_paper_trail_controller_infoset_paper_trail_whodunnit 方法,它们像以前的过滤器一样运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-14
        • 2020-10-09
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 2021-10-29
        • 2014-09-10
        • 1970-01-01
        相关资源
        最近更新 更多