我正在将 Rails 应用程序从单个应用程序转换为多个引擎。
我正在尝试将 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'
我可能有点晚了,但我找到了一个对我有用的解决方案,我认为对每个面临这个问题的人都有效。这很hacky,但直奔问题的关键......
我使用的是 Rails 5,我的引擎名为 MyEngine,我使用的是默认的 ActiveAdmin 命名空间:admin。
进入 /admin 路径时出现的错误是这样的:
路由错误 未初始化常量 MyEngine::Admin
问题是,它正在我的可安装引擎的命名空间内寻找 Admin,因为这就是它们的工作方式,它们将所有内容封装在其命名空间中,但 Admin 命名空间存在于根中(我使用 Rails 控制台检查过),所以我只是转到我引擎的routes.rb文件,在最后(在MyEngine::Engine.routes.draw do ....结束块之后)我刚刚附加了这一行:
MyEngine::Admin = 管理员
这样做之后,它就有效了!
您的问题在这里:
module WebApp
extend ActiveSupport::Autoload
autoload :Admin
end
Admin
是什么?
如果你的意思是
ActiveAdmin
,则不需要以这种方式自动加载它,只需在文件顶部require 'activeadmin'
即可。如果它是您应用程序的常量,则需要将其放在
web_app/admin.rb
中,或者您需要需要包含它的文件。希望对您有帮助,否则请写评论,我会尽力为您提供更多帮助。
我不同意@Uka Lpts 所说的,但后来我得到了与@HFX 相同的错误:
uninitialized constant Admin::DashboardController
。请问有人知道如何解决这个问题吗?