title: ArgumentError: A copy of ApplicationController has been removed from the module tree but is still active
body: <p>I am using ActiveAdmin (with customized gemset for Rails 4) with Rails 4.0.0.rc2. Application also has custom-built authorization code based on railscasts <a href="http://railscasts.com/episodes/385-authorization-from-scratch-part-1" rel="noreferrer">#385</a> and <a href="http://railscasts.com/episodes/386-authorization-from-scratch-part-2" rel="noreferrer">#386</a>.</p>
  <p>When I change something in a ActiveAdmin resource file and try to refresh the browser page, I get this error at the <code>current_permission</code> method:</p>
  <blockquote>
  <p><strong>ArgumentError at /admin/courses</strong></p>
  <p><strong>A copy of ApplicationController has been removed from the module tree but is still active!</strong></p>
  </blockquote>
  <p>If I try a refresh again, I get:</p>
  <blockquote>
  <p><strong>Circular dependency detected while autoloading constant Permissions</strong></p>
  </blockquote>
  <p>I think this problem has something to do with autoloading of classes in development mode, after a change in the source file. I have seen similar problem posts, but they are for rails 2.3.x. Also, the solution seems to be specifying <code>unloadable</code> in the controller throwing this error, but I am not sure where to put in this snippet in ActiveAdmin.</p>
  <p>This might not have anything to do with ActiveAdmin either. It might be about how Permissions class has been built and its usage within Application Controller. If I add a <code>skip_before_filter :authorize</code> in the ActiveAdmin resource class, this error vanishes.</p>
  <p>ApplicationController:</p>
  <pre><code>class ApplicationController &lt; ActionController::Base
    # Prevent CSRF attacks by raising an exception.
    # For APIs, you may want to use :null_session instead.
    protect_from_forgery with: :exception
  
    before_filter :authenticate_user!
    before_filter :authorize
  
    delegate :allow_action?, to: :current_permission
    helper_method :allow_action?
  
    delegate :allow_param?, to: :current_permission
    helper_method :allow_param?
  
    private
      def current_permission
        @current_permission ||= Permissions.permission_for(current_user)
      end
  
      def current_resource
        nil
      end
  
      def authorize
        if current_permission.allow_action?(params[:controller], params[:action], current_resource)
          current_permission.permit_params! params
        else
          redirect_to root_url, alert: &quot;Not authorized.&quot;
        end
      end
  end
  </code></pre>
  <p>Permissions.rb:</p>
  <pre><code>module Permissions
    def self.permission_for(user)
      if user.nil?
        GuestPermission.new
      elsif user.admin?
        AdminPermission.new(user)
      else
        UserPermission.new(user)
      end
    end
  end
  </code></pre>
  <p>admin/courses.rb:</p>
  <pre><code>ActiveAdmin.register Course do
    index do
      column :name
      column :description
      column :duration
      column :status
      column :price
      default_actions
    end
  
    filter :discipline
    filter :level
    filter :lessons
    filter :name
    filter :status
  end
  </code></pre>
  <p>Gemfile (relevant lines):</p>
  <pre><code>gem 'rails', '4.0.0.rc2'
  
  # Use puma as the app server
  gem 'puma'
  
  # Administration - Temporary github refs until rails 4 compatible releases
  gem 'responders',          github: 'plataformatec/responders'
  gem 'inherited_resources', github: 'josevalim/inherited_resources'
  gem 'ransack',             github: 'ernie/ransack',            branch: 'rails-4'
  gem 'activeadmin',         github: 'gregbell/active_admin', branch: 'rails4'
  gem 'formtastic',          github: 'justinfrench/formtastic'
  </code></pre>
  <p>ArgumentError:</p>
  <pre><code>ArgumentError - A copy of ApplicationController has been removed from the module tree but is still active!:
    activesupport (4.0.0.rc2) lib/active_support/dependencies.rb:445:in `load_missing_constant'
    activesupport (4.0.0.rc2) lib/active_support/dependencies.rb:183:in `const_missing'
    rspec-core (2.13.1) lib/rspec/core/backward_compatibility.rb:24:in `const_missing'
    app/controllers/application_controller.rb:17:in `current_permission'
    app/controllers/application_controller.rb:25:in `authorize'
    activesupport (4.0.0.rc2) lib/active_support/callbacks.rb:417:in `_run__1040990970961152968__process_action__callbacks'
    activesupport (4.0.0.rc2) lib/active_support/callbacks.rb:80:in `run_callbacks'
    actionpack (4.0.0.rc2) lib/abstract_controller/callbacks.rb:17:in `process_action'
    actionpack (4.0.0.rc2) lib/action_controller/metal/rescue.rb:29:in `process_action'
    actionpack (4.0.0.rc2) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
    activesupport (4.0.0.rc2) lib/active_support/notifications.rb:159:in `block in instrument'
    activesupport (4.0.0.rc2) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
    activesupport (4.0.0.rc2) lib/active_support/notifications.rb:159:in `instrument'
    actionpack (4.0.0.rc2) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
    actionpack (4.0.0.rc2) lib/action_controller/metal/params_wrapper.rb:245:in `process_action'
    activerecord (4.0.0.rc2) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
    actionpack (4.0.0.rc2) lib/abstract_controller/base.rb:136:in `process'
    actionpack (4.0.0.rc2) lib/abstract_controller/rendering.rb:44:in `process'
    actionpack (4.0.0.rc2) lib/action_controller/metal.rb:195:in `dispatch'
    actionpack (4.0.0.rc2) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
    actionpack (4.0.0.rc2) lib/action_controller/metal.rb:231:in `block in action'
    actionpack (4.0.0.rc2) lib/action_dispatch/routing/route_set.rb:80:in `dispatch'
    actionpack (4.0.0.rc2) lib/action_dispatch/routing/route_set.rb:48:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/journey/router.rb:71:in `block in call'
    actionpack (4.0.0.rc2) lib/action_dispatch/journey/router.rb:59:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/routing/route_set.rb:655:in `call'
    omniauth (1.1.4) lib/omniauth/strategy.rb:184:in `call!'
    omniauth (1.1.4) lib/omniauth/strategy.rb:164:in `call'
    omniauth (1.1.4) lib/omniauth/strategy.rb:184:in `call!'
    omniauth (1.1.4) lib/omniauth/strategy.rb:164:in `call'
    omniauth (1.1.4) lib/omniauth/strategy.rb:184:in `call!'
    omniauth (1.1.4) lib/omniauth/strategy.rb:164:in `call'
    newrelic_rpm (3.6.4.122) lib/new_relic/rack/error_collector.rb:12:in `call'
    newrelic_rpm (3.6.4.122) lib/new_relic/rack/agent_hooks.rb:22:in `call'
    newrelic_rpm (3.6.4.122) lib/new_relic/rack/browser_monitoring.rb:16:in `call'
    newrelic_rpm (3.6.4.122) lib/new_relic/rack/developer_mode.rb:28:in `call'
    meta_request (0.2.7) lib/meta_request/middlewares/app_request_handler.rb:13:in `call'
    rack-contrib (1.1.0) lib/rack/contrib/response_headers.rb:17:in `call'
    meta_request (0.2.7) lib/meta_request/middlewares/headers.rb:16:in `call'
    meta_request (0.2.7) lib/meta_request/middlewares/meta_request_handler.rb:13:in `call'
    warden (1.2.1) lib/warden/manager.rb:35:in `block in call'
    warden (1.2.1) lib/warden/manager.rb:34:in `call'
    rack (1.5.2) lib/rack/etag.rb:23:in `call'
    rack (1.5.2) lib/rack/conditionalget.rb:25:in `call'
    rack (1.5.2) lib/rack/head.rb:11:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/flash.rb:241:in `call'
    rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
    rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/cookies.rb:486:in `call'
    activerecord (4.0.0.rc2) lib/active_record/query_cache.rb:36:in `call'
    activerecord (4.0.0.rc2) lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in `call'
    activerecord (4.0.0.rc2) lib/active_record/migration.rb:369:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
    activesupport (4.0.0.rc2) lib/active_support/callbacks.rb:373:in `_run__2183739952227501342__call__callbacks'
    activesupport (4.0.0.rc2) lib/active_support/callbacks.rb:80:in `run_callbacks'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/reloader.rb:64:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
    better_errors (0.9.0) lib/better_errors/middleware.rb:84:in `protected_app_call'
    better_errors (0.9.0) lib/better_errors/middleware.rb:79:in `better_errors_call'
    better_errors (0.9.0) lib/better_errors/middleware.rb:56:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
    railties (4.0.0.rc2) lib/rails/rack/logger.rb:38:in `call_app'
    railties (4.0.0.rc2) lib/rails/rack/logger.rb:21:in `block in call'
    activesupport (4.0.0.rc2) lib/active_support/tagged_logging.rb:67:in `block in tagged'
    activesupport (4.0.0.rc2) lib/active_support/tagged_logging.rb:25:in `tagged'
    activesupport (4.0.0.rc2) lib/active_support/tagged_logging.rb:67:in `tagged'
    railties (4.0.0.rc2) lib/rails/rack/logger.rb:21:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/request_id.rb:21:in `call'
    rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
    rack (1.5.2) lib/rack/runtime.rb:17:in `call'
    activesupport (4.0.0.rc2) lib/active_support/cache/strategy/local_cache.rb:83:in `call'
    rack (1.5.2) lib/rack/lock.rb:17:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/static.rb:64:in `call'
    railties (4.0.0.rc2) lib/rails/engine.rb:511:in `call'
    railties (4.0.0.rc2) lib/rails/application.rb:97:in `call'
    rack (1.5.2) lib/rack/content_length.rb:14:in `call'
    puma (2.1.1) lib/puma/server.rb:369:in `handle_request'
    puma (2.1.1) lib/puma/server.rb:246:in `process_client'
    puma (2.1.1) lib/puma/server.rb:145:in `block in run'
    puma (2.1.1) lib/puma/thread_pool.rb:92:in `block in spawn_thread'
  </code></pre>
  <p>RuntimeError: Circular Dependency:</p>
  <pre><code>RuntimeError - Circular dependency detected while autoloading constant Permissions:
    activesupport (4.0.0.rc2) lib/active_support/dependencies.rb:460:in `load_missing_constant'
    activesupport (4.0.0.rc2) lib/active_support/dependencies.rb:183:in `const_missing'
    rspec-core (2.13.1) lib/rspec/core/backward_compatibility.rb:24:in `const_missing'
    activesupport (4.0.0.rc2) lib/active_support/dependencies.rb:686:in `remove_constant'
    activesupport (4.0.0.rc2) lib/active_support/dependencies.rb:516:in `block in remove_unloadable_constants!'
    activesupport (4.0.0.rc2) lib/active_support/dependencies.rb:516:in `remove_unloadable_constants!'
    activesupport (4.0.0.rc2) lib/active_support/dependencies.rb:300:in `clear'
    railties (4.0.0.rc2) lib/rails/application/finisher.rb:90:in `block (2 levels) in &lt;module:Finisher&gt;'
    activesupport (4.0.0.rc2) lib/active_support/file_update_checker.rb:75:in `execute'
    railties (4.0.0.rc2) lib/rails/application/finisher.rb:105:in `block (2 levels) in &lt;module:Finisher&gt;'
    activesupport (4.0.0.rc2) lib/active_support/callbacks.rb:377:in `_run__2753119820186226816__prepare__callbacks'
    activesupport (4.0.0.rc2) lib/active_support/callbacks.rb:80:in `run_callbacks'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/reloader.rb:74:in `prepare!'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/reloader.rb:62:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
    better_errors (0.9.0) lib/better_errors/middleware.rb:84:in `protected_app_call'
    better_errors (0.9.0) lib/better_errors/middleware.rb:79:in `better_errors_call'
    better_errors (0.9.0) lib/better_errors/middleware.rb:56:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
    railties (4.0.0.rc2) lib/rails/rack/logger.rb:38:in `call_app'
    railties (4.0.0.rc2) lib/rails/rack/logger.rb:21:in `block in call'
    activesupport (4.0.0.rc2) lib/active_support/tagged_logging.rb:67:in `block in tagged'
    activesupport (4.0.0.rc2) lib/active_support/tagged_logging.rb:25:in `tagged'
    activesupport (4.0.0.rc2) lib/active_support/tagged_logging.rb:67:in `tagged'
    railties (4.0.0.rc2) lib/rails/rack/logger.rb:21:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/request_id.rb:21:in `call'
    rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
    rack (1.5.2) lib/rack/runtime.rb:17:in `call'
    activesupport (4.0.0.rc2) lib/active_support/cache/strategy/local_cache.rb:83:in `call'
    rack (1.5.2) lib/rack/lock.rb:17:in `call'
    actionpack (4.0.0.rc2) lib/action_dispatch/middleware/static.rb:64:in `call'
    railties (4.0.0.rc2) lib/rails/engine.rb:511:in `call'
    railties (4.0.0.rc2) lib/rails/application.rb:97:in `call'
    rack (1.5.2) lib/rack/content_length.rb:14:in `call'
    puma (2.1.1) lib/puma/server.rb:369:in `handle_request'
    puma (2.1.1) lib/puma/server.rb:246:in `process_client'
    puma (2.1.1) lib/puma/server.rb:145:in `block in run'
    puma (2.1.1) lib/puma/thread_pool.rb:92:in `block in spawn_thread'
  </code></pre>
  <p>Any clue will help.
  Let me know if you need to view other code snippets in the application.</p>