4

J'utilise le bijou paper_trail pour versioning mes modèles.Papertrail: info_for_paper_trail en dehors du contexte d'un contrôleur

Jusqu'à présent, mon modèle dépend de la méthode info_for_paper_trail dans 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 

Cela fonctionne très bien dans le contexte du contrôleur, mais est-il un moyen que je peux reproduire ce genre de chose en dehors du contexte du contrôleur (par exemple, un travail retardé)?

J'ai essayé de créer un attribut virtuel appelé revision et passer un proc dans has_paper_trail, mais des erreurs avec une exception 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! 

Je suppose que la base de ce résultat que meta ne peut pas prendre un proc et plus je n'aime pas comment cette solution sent de toute façon ...

Répondre

4

Vous devez définir ces valeurs dans votre code si vous travaillez en dehors du contrôleur:

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

Le modèle sélectionnera alors les valeurs supplémentaires juste comme il le ferait normalement du contrôleur.

Je dérivé cette information de regarder le module PaperTrail::Controller. En particulier, regardez les méthodes set_paper_trail_controller_info et set_paper_trail_whodunnit qui s'exécutent comme avant les filtres.

0

Je pense que vous pouvez juste faire:

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 
Questions connexes