2016-02-24 1 views
1

J'utilise PaperTrail 4.1 avec Rails 4.2.Pourquoi les méthodes définies dans un initialiseur déclenchent-elles par intermittence une erreur 'non définie' qui est résolue en redémarrant le serveur?

J'ai défini plusieurs méthodes personnalisées dans un initialiseur (voir How to add a method to the versions model of Paper_trail?)

#config/initializers/paper_trail.rb 
PaperTrail::Rails::Engine.eager_load! 
module PaperTrail 
    class Version < ActiveRecord::Base 
    scope :scoped,  lambda { #selects some records } 
    def custom_method 
     #does some stuff 
    end 
    end 
end 

si souvent dans chaque environnement de développement je reçois un method not defined error pour les méthodes/champs définis dans le présent initialiseur.

Le redémarrage du serveur résout le problème. Pourquoi ces méthodes sont-elles «perdues» pour Rails?

Pourquoi?

Est-ce un problème qui se présentera également dans des environnements de production ou autres?

Quelles mesures puis-je prendre pour trouver la cause de ce problème?

+1

Le code d'initialisation est exécuté une fois au démarrage du serveur, également dans l'environnement de développement. Lorsque le code est modifié, le redémarrage est requis. – Mareq

+0

merci Mareq. Ce code d'initialisation n'est pas en cours de modification. Je travaille avec des contrôleurs et des vues. Souhaitez-vous toujours que ces rechargements soient nécessaires? –

+0

Étrange. Il semble donc que le code soit rechargé et que votre contenu soit remplacé par du contenu original. – Mareq

Répondre

2

Pour tous ceux qui arrivent d'autre ici, apparemment cela est un problème connu avec Papertrail

De https://github.com/airblade/paper_trail/pull/492

maintenant de la source de paper_trail get rechargées dans le développement environnement lors de l'enregistrement d'un fichier qui signifie que la classe obtient supprimé du cache et reconstruit à partir des sources paper_trail. L'initialiseur n'est pas interprété à nouveau car ils sont une seule fois, aucun module_eval, aucune classe abstraite -> exceptions.

et un correctif a été inclus dans la dernière version de la pierre précieuse: https://github.com/airblade/paper_trail/pull/557

En substance, il est pas conseillé plus d'utiliser un initialiseur pour ajouter des méthodes personnalisées à Papertrail, et au lieu d'utiliser un modèle qui hérite de PaperTrail (qui correspond beaucoup mieux à AR).

# app/models/paper_trail/version.rb 
module PaperTrail 
    class Version < ActiveRecord::Base 
    include PaperTrail::VersionConcern 
    # my custom methods 
    end 
end