4

Я использую жемчужину paper_trail для версий моих моделей.PaperTrail: info_for_paper_trail вне контекста контроллера

До сих пор моя модель зависит от метода 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 в 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, и плюс мне не нравится, как это решение пахнет в любом случае ...

ответ

4

Вам необходимо установить эти значения в своем коде, если вы работаете вне контроллера:

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

Модель затем выберет дополнительные значения, как обычно, с контроллера.

Я получил эту информацию от просмотра модуля PaperTrail::Controller. В частности, посмотрите на методы set_paper_trail_controller_info и set_paper_trail_whodunnit, которые запускаются как фильтры перед запуском.

0

Я думаю, вы можете просто сделать:

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 
Смежные вопросы