Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
484 views
in Technique[技术] by (71.8m points)

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

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 #385 and #386.

When I change something in a ActiveAdmin resource file and try to refresh the browser page, I get this error at the current_permission method:

ArgumentError at /admin/courses

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

If I try a refresh again, I get:

Circular dependency detected while autoloading constant Permissions

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 unloadable in the controller throwing this error, but I am not sure where to put in this snippet in ActiveAdmin.

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 skip_before_filter :authorize in the ActiveAdmin resource class, this error vanishes.

ApplicationController:

class ApplicationController < 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: "Not authorized."
      end
    end
end

Permissions.rb:

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

admin/courses.rb:

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

Gemfile (relevant lines):

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'

ArgumentError:

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'

RuntimeError: Circular Dependency:

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 <module:Finisher>'
  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 <module:Finisher>'
  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'

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...