ArgumentError:ApplicationController的副本已从模块树中删除,但仍处于活动状态
我正在使用Rails 4.0.0.rc2的ActiveAdmin(与定制gemset的Rails 4)。 应用程序还具有基于Railcast #385和#386的定制授权代码。
当我更改ActiveAdmin资源文件中的某些内容并尝试刷新浏览器页面时,在current_permission
方法中出现此错误:
/ admin / courses中的参数错误
ApplicationController的副本已从模块树中删除,但仍处于活动状态!
如果我再次尝试刷新,我会得到:
自动加载常量权限时检测到循环依赖关系
我认为这个问题与在源代码文件中改变之后在开发模式下自动加载类有关。 我已经看到类似的问题post,但他们是为rails 2.3.x. 此外,解决scheme似乎是指定在控制器抛出此错误,可unloadable
,但我不知道在这个片段放在ActiveAdmin的位置。
这可能与ActiveAdmin没有任何关系。 这可能是关于如何构buildPermissions类以及它在Application Controller中的用法。 如果我在ActiveAdmin资源类中添加skip_before_filter :authorize
,则此错误消失。
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
pipe理员/ 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(相关行):
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:循环依赖:
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' 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'
任何线索都会有帮助。 让我知道如果你需要查看应用程序中的其他代码片段。
我不确定这是为什么发生,但我发现了一个工作。 改变这个:
def current_permission @current_permission ||= Permissions.permission_for(current_user) end
对此:
def current_permission @current_permission ||= ::Permissions.permission_for(current_user) end
在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
只有当您没有完全限定常量名称时才会出现问题,所以Rails会尝试在ApplicationController
名称空间中查找它。
对于未来的访问者,我想我会提供一些原始问题的澄清,即使这个问题是相当古老的,已经有了一个可以接受的答案。
ArgumentError: A copy of X has been removed from the module tree but is still active
当您尝试从不是自动重新加载的(在lib目录中)访问自动重新加载的类(在应用程序目录中)时,会引发ArgumentError: A copy of X has been removed from the module tree but is still active
。
我没有使用ActiveAdmin,但我只是遇到与ApplicationController循环依赖。
问题是一个辅助模块宣布不正确:
app/helpers/home_helper.rb
被宣布为:
module StaticHelper
解决这个之后,一切都很好。 我没有研究为什么发生这种情况,Rails没有返回一个更智能的错误信息。
在你的development.rb暂时尝试把
config.cache_classes = true
它为我工作。
你可以尝试把这行放在你的config/initializers/active_admin.rb
:
config.skip_before_filter :load_footer_variables
就像这里提到的