A copy of xxx has been removed from the module tree but is still active

Ruby on-RailsRubyRuby on-Rails-4

Ruby on-Rails Problem Overview


I'm pretty sure the error has nothing to do with the actual content of the TenantIdLoader module. Instead, it has something to do with ActiveSupport Dependencies.

I can't seem to get past this error. From what I've read, it's because either ActiveRecord::Base is getting reloaded or Company::TenantIdLoader is getting reloaded, and it's somehow not communicating that. Help, please! I'd really like to be able to get upgraded to Rails 4.2.

EDIT

I've now learned that it's because I'm referencing Tenant which is getting reloaded automatically. I need to be able to actually reference the class though, so does anyone know how to get around this?

config/application.rb

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

config/initializers/company.rb

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

lib/company/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

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

Tenant is sort of a red herring - the error would occur if you referenced any bit of app that needs to be loaded by rails' const_missing trick.

The problem is that you are taking something reloadable (your module) and then including it in something not reloadable (ActiveRecord::Base or, in your earlier example ActionMailer::Base). At some point your code is reloaded and now ActiveRecord still has this module included in it even though rails thinks it has unloaded it. The error occurs when you reference Tenant because that causes rails to run its const_missing hooks to find out where Tenant should be loaded from and that code freaks out because the module where the constant search is starting from shouldn't be there.

There are 3 possible solutions:

  1. Stop including your module into non reloadable classes - either include into individual models, controllers as needed or create an abstract base class and include the module in there.

  2. Make this module non reloadable by storing it somewhere that isn't in autoload_paths (you'll have to require it explicitly since rails will no longer load it magically for you)

  3. Changing Tenant to ::Tenant (Object.const_missing will then be invoked, not Tenant.const_missing)

Solution 2 - Ruby on-Rails

Changing ModuleName to ::ModuleName worked for me.

Solution 3 - Ruby on-Rails

Not sure if this will help anyone, but I had this suddenly start happening after a change that seemed unrelated. It went away after I restarted the application server.

Solution 4 - Ruby on-Rails

Changing ModuleName to 'ModuleName'.constantize solved the issue for me.

Solution 5 - Ruby on-Rails

Another way to solve this issue is to require the module directly in the file that is not reloadable.

At the top of lib/company/tenant_id_loader.rb put require_relative '../../app/models/tenant' or whatever the path is relative to the id loader to the tenant model.

Solution 6 - Ruby on-Rails

What worked for me:

Update config.eager_load = false to true

in config/environments/development.rb

Ruby 2.6.5
Rails 5.1.6

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionkddeiszView Question on Stackoverflow
Solution 1 - Ruby on-RailsFrederick CheungView Answer on Stackoverflow
Solution 2 - Ruby on-RailsAman KumarView Answer on Stackoverflow
Solution 3 - Ruby on-Railsbeef_booleanView Answer on Stackoverflow
Solution 4 - Ruby on-RailsQortexView Answer on Stackoverflow
Solution 5 - Ruby on-RailsderigibleView Answer on Stackoverflow
Solution 6 - Ruby on-RailsJan WerkhovenView Answer on Stackoverflow