【问题标题】:Controllers not being loaded when mounting a Rails Engine安装 Rails 引擎时未加载控制器
【发布时间】:2021-04-25 10:11:50
【问题描述】:

我目前正在创建一个 Rails 引擎。到目前为止,引擎有一些新的路线和一些新的控制器。路由工作正常,因为我能够安装它们,将以下内容添加到 config/routes.rb:

mount MyEngine::Engine => '/'

问题出在控制器上。尝试访问我定义的操作时,我得到:

uninitialized constant MyEngine::ApplicationController

我有点惊讶,因为文档表明 app/ 中的所有内容都是从引擎自动加载的。我什至尝试在engine.rb 中显式加载控制器,但无济于事:

module MyEngine
  class Engine < ::Rails::Engine
    isolate_namespace MyEngine

    Dir["#{config.root}/app/controllers/**/"].each do |path|
      config.eager_load_paths << path
    end
  end
end

我很困惑。 app/controllers/ 的内容不是应该由应用程序从引擎自动加载吗?

【问题讨论】:

  • 我遇到过类似的问题,它只发生在 Mac 上。在代码编辑器中打开相应的应用控制器并保存即可清除错误。

标签: ruby-on-rails


【解决方案1】:

看起来你的引擎控制器试图在你的引擎中引用一个 ApplicationController,而你可能想从主应用程序的 ApplicationController 继承(如果我错了,请纠正我)。

我不知道你引擎中的控制器代码是什么样子(如果我没有走上正确的轨道,请随意分享),但我认为它看起来像这样

module MyEngine
  class MyController < ApplicationController

  end
end

在这种情况下,它还需要您在某处定义 MyEngine::ApplicationController,并且根据错误消息,我假设此控制器不存在。

要解决这个问题,您可以定义引擎特定的 ApplicationController,也可以指定要从根控制器继承,如下所示:

module MyEngine
  class MyController < ::ApplicationController

  end
end

如果您以后想在引擎中更加灵活,通常留给初始化程序配置选项来设置从哪个控制器继承 (see example from Devise)。

module MyEngine
  class MyController < MyEngine.parent_controller.constantize

  end
end

【讨论】:

  • 我确实有一个如下所示的 ApplicationController:``` module MyEngine class ApplicationController
  • 好的,我明白了。这个控制器的路径是什么?当您希望自动加载类时,文件夹路径必须与模块和类名匹配。所以它应该位于 app/my_engine/application_controller.rb 中。是这样吗?
  • 不完全是。路径为 app/controllers/my_engine/application_controller.rb
  • 当然,我的错。这似乎很奇怪。这似乎是正确的。生成错误消息的文件是哪个文件?它至少来自引擎中的控制器吗?因为这至少表明它是否在自动加载一般不起作用,或者应用程序控制器文件有问题
猜你喜欢
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
相关资源
最近更新 更多