ArgumentError: A copy of ApplicationController has been removed from the module tree but is still active

For future visitors, I thought I'd provide some clarification on the original problem even though the question is pretty old and there is already an accepted answer.

The ArgumentError: A copy of X has been removed from the module tree but is still active is raised when you are trying to access an automatically reloaded class (in app directory) from one that is not automatically reloaded (in lib directory).


I'm not sure exactly why this is happening, but I found a workaound. Change this:

def current_permission
  @current_permission ||= Permissions.permission_for(current_user)
end

To this:

def current_permission
  @current_permission ||= ::Permissions.permission_for(current_user)
end

The error is raised at this point in ActiveSupport:

# Load the constant named +const_name+ which is missing from +from_mod+. If
# it is not possible to load the constant into from_mod, try its parent
# module using +const_missing+.
def load_missing_constant(from_mod, const_name)
  log_call from_mod, const_name

  unless qualified_const_defined?(from_mod.name) && Inflector.constantize(from_mod.name).equal?(from_mod)
    raise ArgumentError, "A copy of #{from_mod} has been removed from the module tree but is still active!"
  end
  # ...
end

The problem only occurs when you don't fully qualify the constant name, so Rails tries looking it up in the ApplicationController namespace.


In you development.rb temporarily try putting

config.cache_classes = true

It worked for me.