Je suis presque sûr que l'erreur n'a rien à voir avec le contenu réel du TenantIdLoader
module. Au lieu de cela, cela a quelque chose à voir avec les ActiveSupport
dépendances.
Je n'arrive pas à surmonter cette erreur. D'après ce que j'ai lu, c'est parce que soit ActiveRecord::Base
en cours de rechargement, soit Company::TenantIdLoader
en cours de rechargement, et cela ne communique pas d'une manière ou d'une autre. Aidez-moi, s'il vous plaît! J'aimerais vraiment pouvoir être mis à niveau vers Rails 4.2.
ÉDITER
J'ai maintenant appris que c'est parce que je fais référence à Tenant
ce qui est rechargé automatiquement. J'ai besoin de pouvoir faire référence à la classe, alors est-ce que quelqu'un sait comment contourner cela?
config / application.rb
config.autoload_paths += %W( #{config.root}/lib/company )
config / initialiseurs / company.rb
ActionMailer::Base.send(:include, Company::TenantIdLoader)
lib / entreprise / tenant_id_loader.rb
module Company
module TenantIdLoader
extend ActiveSupport::Concern
included do
cattr_accessor :tenant_dependency
self.tenant_dependency = {}
after_initialize do
self.tenant_id = Tenant.active.id if self.class.tenant_dependent? and self.new_record? and Tenant.active.present? and !Tenant.active.zero?
end
end
# class methods to be mixed in
module ClassMethods
# returns true if this model's table has a tenant_id
def tenant_dependent?
self.tenant_dependency[self.table_name] ||= self.column_names.include?('tenant_id')
end
end
end
end
la source
Réponses:
Tenant
est une sorte de hareng rouge - l'erreur se produirait si vous référençiez un morceau d'application qui doit être chargé par l'const_missing
astuce des rails .Le problème est que vous prenez quelque chose de rechargeable (votre module) et que vous l'incluez ensuite dans quelque chose de non rechargeable (
ActiveRecord::Base
ou, dans votre exemple précédentActionMailer::Base
). À un moment donné, votre code est rechargé et maintenant ActiveRecord a toujours ce module inclus même si rails pense qu'il l'a déchargé. L'erreur se produit lorsque vous faites référence à Tenant, car cela oblige les rails à exécuter sesconst_missing
hooks pour savoir d'où Tenant doit être chargé et ce code panique car le module à partir duquel la recherche constante commence ne devrait pas être là.Il existe 3 solutions possibles:
Arrêtez d'inclure votre module dans des classes non rechargeables - incluez dans des modèles individuels, des contrôleurs si nécessaire ou créez une classe de base abstraite et incluez le module là-dedans.
Rendez ce module non rechargeable en le stockant quelque part qui ne soit pas dans autoload_paths (vous devrez l'exiger explicitement car les rails ne le chargeront plus par magie pour vous)
Changer Tenant en :: Tenant (
Object.const_missing
sera alors invoqué, pasTenant.const_missing
)la source
::
fonctionné pour moi!./bin/spring stop
résoudre était de le résoudre.Changer ModuleName en :: ModuleName a fonctionné pour moi.
la source
Je ne sais pas si cela aidera quelqu'un, mais cela a soudainement commencé à se produire après un changement qui ne semblait pas lié. Il a disparu après le redémarrage du serveur d'applications.
la source
Changer
ModuleName
pour'ModuleName'.constantize
résoudre le problème pour moi.la source
Ce qui a fonctionné pour moi:
Mettre
config.eager_load = false
à jour verstrue
dans
config/environments/development.rb
Ruby 2.6.5
Rails 5.1.6
la source
Parfois tu viens
Redémarrez votre serveur,
la source
A copy of X has been removed from the module tree but is still active
sur toutes les pages contenant ObjectY.embeds X
, et redémarrer le serveur fonctionne vraiment pour ce cas spécifique. Mais vous devez modifier votre réponse.