2015-04-14 6 views
75

Ich bin mir ziemlich sicher, dass der Fehler nichts mit dem tatsächlichen Inhalt des TenantIdLoader Moduls zu tun hat. Stattdessen hat es etwas mit ActiveSupport-Abhängigkeiten zu tun.Eine Kopie von xxx wurde aus dem Modulbaum entfernt, ist aber immer noch aktiv

Ich kann nicht scheinen, über diesen Fehler zu kommen. Von dem, was ich gelesen habe, liegt es daran, dass entweder ActiveRecord :: Base neu geladen wird oder Company :: TenantIdLoader neu geladen wird und das irgendwie nicht kommuniziert. Hilfe bitte! Ich möchte wirklich auf Rails 4.2 aktualisiert werden können.

EDIT

ich gelernt habe, jetzt, wo es ist, weil ich Mieter bin Referenzierung, die automatisch nachgeladen wird immer. Ich muss in der Lage sein, tatsächlich auf die Klasse zu verweisen, weiß also jemand, wie man das schafft?

config/application.rb

config.autoload_paths += %W(#{config.root}/lib/company) 

config/initializers/company.rb

ActionMailer::Base.send(:include, Company::TenantIdLoader) 

lib/Unternehmen/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 
+2

Hilft diese Antwort überhaupt? http://stackoverflow.com/questions/17561697/argumenteterror-a-copy-of-applicationcontroller-has-been-removed-from-the-module/23008837#23008837 –

+0

Sind Sie sicher, dass die Mieter-Klasse beteiligt ist? Wenn Sie die Bits dieses Codes, die Tenant verwenden, ausgeben, erhalten Sie immer noch einen Fehler? –

+0

@WaynnLue yeah Ich denke, das ist der Grund, ich weiß einfach nicht, wie ich es beheben kann. – kddeisz

Antwort

105

Tenant ist eine Art von rot Hering - der Fehler würde auftreten, wenn Sie ein Bit der App referenziert, die von Rails 'geladen werden müssenTrick.

Das Problem ist, dass Sie etwas nachladbar (Ihr Modul) einnehmen und einschließlich es dann in etwas nicht wiederaufladbar (ActiveRecord::Base oder in Ihrem früheren Beispiel ActionMailer::Base). Irgendwann wird Ihr Code neu geladen und ActiveRecord enthält dieses Modul noch, obwohl Rails denkt, dass es es entladen hat. Der Fehler tritt auf, wenn Sie auf Tenant verweisen, da dies bewirkt, dass Rails seine const_missing-Hooks ausführen, um herauszufinden, wo der Tenant geladen werden sollte und dass der Code ausflippt, weil das Modul, von dem aus die Constant-Suche gestartet wird, nicht vorhanden sein sollte.

Es gibt 3 mögliche Lösungen:

  1. Stopp einschließlich Ihres Moduls in nicht wiederaufladbar Klassen - entweder sind in einzelne Modelle, Controller je nach Bedarf oder eine abstrakte Basisklasse erstellen und schließen Sie das Modul drin.

  2. Machen Sie dieses Modul nicht wiederaufladbar, indem sie es irgendwo zu speichern, die nicht in autoload_paths ist (Sie werden es müssen verlangen ausdrücklich, da Schienen wird es nicht mehr auf magische Weise für Sie laden)

  3. Mieter ändern :: Mieter (Object.const_missing wird dann aufgerufen werden, nicht Tenant.const_missing)

+20

Ich habe eine dritte Lösung gefunden, obwohl ich mich gefragt habe, ob Sie wissen, warum es funktioniert. Wenn ich es beziehe, war :: Mieter, alles funktioniert magisch. Möglicherweise, weil es dann als eine Konstante auf höchster Ebene geladen wird? Könnte sein? – kddeisz

+3

Dann wird Object.const_missing aufgerufen, nicht YourModule.const_missing, also sollten die Dinge funktionieren –

+0

Schön! Ich gebe dir die Punkte, weil du mich zur Antwort geführt hast. Vielen Dank! – kddeisz

7

Ändern Module zu :: Module für mich gearbeitet.

Verwandte Themen