在可安装rails引擎内运行ActiveAdmin时出错:无法加载此类文件--web_app/admin

问题描述 投票:0回答:3

我正在将 Rails 应用程序从单个应用程序转换为多个引擎。

我正在尝试将 ActiveAdmin 移至运行前端应用程序的引擎中。

堆栈是:

  • 红宝石4.2.2
  • 导轨4.1
  • 设计3.5.1
  • 来自 github master 分支的 ActiveAdmin。

我已将 ActiveAdmin 包含在 gemspec 中:

s.add_dependency 'activeadmin'

在我的 gemfile 中:

gem 'activeadmin', github: 'activeadmin'

在我的 web_app/lib 文件夹中,文件 web_app.rb 如下所示:

require "web_app/engine"

module WebApp
  extend ActiveSupport::Autoload
  autoload :Admin
end

web_app/lib/web_app 中的引擎文件包含以下内容:

require 'devise'
require 'activeadmin'

module WebApp
  class Engine < ::Rails::Engine
    isolate_namespace WebApp

    initializer "web_app.assets.precompile" do |app|
      app.config.assets.precompile += %w( web_app/common.css web_app/desktop.css eb_app/common_tablet_mobile.css web_app/mobile.css web_app/tablet.css ie/json2.js )
    end

    initializer :web_app do
      ActiveAdmin.application.load_paths += Dir[File.dirname(__FILE__) + '/admin']
    end
  end
end

路线文件如下所示:

WebApp::Engine.routes.draw do

  ActiveAdmin.routes(self)
  ...
end

所有 ActiveAdmin 资源都存储在 web_app/lib/web_app/admin 中。

以管理员用户身份登录后,抛出以下错误:

cannot load such file -- web_app/admin

activesupport (4.1.11) lib/active_support/inflector/methods.rb:240:in `block in constantize'
activesupport (4.1.11) lib/active_support/inflector/methods.rb:236:in `constantize'
activesupport (4.1.11) lib/active_support/dependencies.rb:552:in `get'
activesupport (4.1.11) lib/active_support/dependencies.rb:583:in `constantize'
actionpack (4.1.11) lib/action_dispatch/routing/route_set.rb:78:in `controller_reference'
actionpack (4.1.11) lib/action_dispatch/routing/route_set.rb:68:in `controller'
actionpack (4.1.11) lib/action_dispatch/routing/route_set.rb:46:in `call'
actionpack (4.1.11) lib/action_dispatch/journey/router.rb:73:in `block in call'
actionpack (4.1.11) lib/action_dispatch/journey/router.rb:59:in `call'
actionpack (4.1.11) lib/action_dispatch/routing/route_set.rb:692:in `call'
railties (4.1.11) lib/rails/engine.rb:514:in `call'
railties (4.1.11) lib/rails/railtie.rb:194:in `method_missing'
actionpack (4.1.11) lib/action_dispatch/journey/router.rb:73:in `block in call'
actionpack (4.1.11) lib/action_dispatch/journey/router.rb:59:in `call'
actionpack (4.1.11) lib/action_dispatch/routing/route_set.rb:692:in `call'
bullet (4.14.7) lib/bullet/rack.rb:10:in `call'
rack-mobile-detect (0.4.0) lib/rack/mobile-detect.rb:164:in `call'
warden (1.2.3) lib/warden/manager.rb:35:in `block in call'
warden (1.2.3) lib/warden/manager.rb:34:in `call'
rack (1.5.5) lib/rack/etag.rb:23:in `call'
rack (1.5.5) lib/rack/conditionalget.rb:25:in `call'
rack (1.5.5) lib/rack/head.rb:11:in `call'
actionpack (4.1.11) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.1.11) lib/action_dispatch/middleware/flash.rb:254:in `call'
rack (1.5.5) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.5.5) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.1.11) lib/action_dispatch/middleware/cookies.rb:562:in `call'
activerecord (4.1.11) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.1.11) lib/active_record/connection_adapters/abstract/connection_pool.rb:621:in `call'
activerecord (4.1.11) lib/active_record/migration.rb:380:in `call'
actionpack (4.1.11) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.1.11) lib/active_support/callbacks.rb:82:in `run_callbacks'
actionpack (4.1.11) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.1.11) lib/action_dispatch/middleware/reloader.rb:73:in `call'
actionpack (4.1.11) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
better_errors (2.1.1) lib/better_errors/middleware.rb:84:in `protected_app_call'
better_errors (2.1.1) lib/better_errors/middleware.rb:79:in `better_errors_call'
better_errors (2.1.1) lib/better_errors/middleware.rb:57:in `call'
actionpack (4.1.11) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
actionpack (4.1.11) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.1.11) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.1.11) lib/rails/rack/logger.rb:22:in `call'
request_store (1.1.0) lib/request_store/middleware.rb:8:in `call'
actionpack (4.1.11) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.5.5) lib/rack/methodoverride.rb:21:in `call'
rack (1.5.5) lib/rack/runtime.rb:17:in `call'
activesupport (4.1.11) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
rack (1.5.5) lib/rack/lock.rb:17:in `call'
actionpack (4.1.11) lib/action_dispatch/middleware/static.rb:84:in `call'
rack (1.5.5) lib/rack/sendfile.rb:112:in `call'
railties (4.1.11) lib/rails/engine.rb:514:in `call'
railties (4.1.11) lib/rails/application.rb:144:in `call'
rack (1.5.5) lib/rack/lock.rb:17:in `call'
rack (1.5.5) lib/rack/content_length.rb:14:in `call'
rack (1.5.5) lib/rack/handler/webrick.rb:60:in `service'
/Users/kfranzen/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/webrick/httpserver.rb:138:in `service'
/Users/kfranzen/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/webrick/httpserver.rb:94:in `run'
/Users/kfranzen/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/webrick/server.rb:294:in `block in start_thread'

引擎的目录列表

wep_app/
  app/
    assets/
    controllers/
    helpers/
    mailers/
    models/
    views/
  config/
    initializers/
      active_admin.rb
  lib/
    web_app.rb
    web_app/
      engine.rb
      version.rb
      admin/
        resource files
    tasks/
  spec/

更新问题的缩小版本:

我将问题范围缩小到在已安装的引擎中加载 ActiveAdmin。

首先,我将上面记录的引擎更改为完整引擎,因此所有路由都由父应用程序继承。这解决了访问 ActiveAdmin 路由的主要问题。

因此,我已将 ActiveAdmin 和其他管理特定代码移至单独的引擎“管理”引擎中。

admin.gemspec 文件包括:

s.add_dependency 'activeadmin'

Gemfile 包含以下行来提取当前版本:

gem 'activeadmin', github: 'activeadmin'

admin/lib 文件夹包含文件 admin.rb,如下所示:

require "admin/engine"

module Admin
  extend ActiveSupport::Autoload
end

admin/lib/admin 中的引擎文件包含以下内容:

require 'activeadmin'
require 'activeadmin_hstore_editor'
require 'active_admin_csv_import'
require 'ckeditor'

module Admin
  class Engine < ::Rails::Engine

    initializer "admin.assets.precompile" do |app|
      app.config.assets.precompile += %w( vendor.css vendor.js ckeditor/* )
    end

    initializer :admin do
      ActiveAdmin.application.load_paths += Dir[File.dirname(__FILE__) + '/admin']
    end
  end
end

路线文件如下所示:

Admin::Engine.routes.draw do

  ActiveAdmin.routes(self)

end

所有 ActiveAdmin 资源都存储在 web_app/lib/admin/admin 中。

只要加载引擎,ActiveAdmin 就可以正常工作,而无需:

isolate_namespace Admin

如果添加了isolate_namespace,则会出现上一节中报告的错误。

将引擎加载为可安装引擎时,父级 Rails.application.routes 包含以下内容:

mount Admin::Engine, at: '/', as: 'admin'
ruby-on-rails-4 activeadmin
3个回答
1
投票

我可能有点晚了,但我找到了一个对我有用的解决方案,我认为对每个面临这个问题的人都有效。这很hacky,但直奔问题的关键......

我使用的是 Rails 5,我的引擎名为 MyEngine,我使用的是默认的 ActiveAdmin 命名空间:admin。

进入 /admin 路径时出现的错误是这样的:

路由错误 未初始化常量 MyEngine::Admin

问题是,它正在我的可安装引擎的命名空间内寻找 Admin,因为这就是它们的工作方式,它们将所有内容封装在其命名空间中,但 Admin 命名空间存在于根中(我使用 Rails 控制台检查过),所以我只是转到我引擎的routes.rb文件,在最后(在MyEngine::Engine.routes.draw do ....结束块之后)我刚刚附加了这一行:

MyEngine::Admin = 管理员

这样做之后,它就有效了!


0
投票

您的问题在这里:

module WebApp
  extend ActiveSupport::Autoload
  autoload :Admin
end

Admin
是什么?

  • 如果你的意思是

    ActiveAdmin
    ,则不需要以这种方式自动加载它,只需在文件顶部
    require 'activeadmin'
    即可。

  • 如果它是您应用程序的常量,则需要将其放在

    web_app/admin.rb
    中,或者您需要需要包含它的文件。

希望对您有帮助,否则请写评论,我会尽力为您提供更多帮助。


0
投票

我不同意@Uka Lpts 所说的,但后来我得到了与@HFX 相同的错误:

uninitialized constant Admin::DashboardController
。请问有人知道如何解决这个问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.