尝试让我的gem在Rails 7中工作。我已经确认它在Rails 6.1.4.1(最新版本(中有效。
在我的引擎的engine.rb文件中,我有这个。。。
module MyEngine
class Engine < ::Rails::Engine
isolate_namespace MyEngine
initializer "my_engine.include_controller" do |app|
ActionController::Base.send :include, MyEngine::MyController
end
end
end
当服务器启动或运行控制台时,我会。。。
uninitialized constant MyEngine::MyController (NameError)
我将gem控制器放在它们的命名空间目录中,并在Rails6.1中重申这一点。
我也尝试过这些变体,但都有同样的错误。。。
ActionController::Base.include MyEngine::MyController
ActiveSupport.on_load :action_controller_base do
include MyEngine::MyController
end
如果我把以下内容放在主应用程序的ApplicationController中,那么它就可以工作了。。。
include MyEngine::MyController
有人知道如何调用这些钩子吗?或者我应该把它作为一个bug报告给rails团队吗?
我能够通过将所需文件推送到autoload_once_paths
配置来解决同样的问题。这里是一个可能的修复示例。
module MyEngine
class Engine < ::Rails::Engine
isolate_namespace MyEngine
config.autoload_once_paths << "#{root}/app/controllers"
initializer "my_engine.include_controller" do |app|
ActionController::Base.send :include, MyEngine::MyController
end
end
end
来源:
- https://edgeguides.rubyonrails.org/autoloading_and_reloading_constants.html#config-自动加载一次路径
- https://github.com/charlotte-ruby/impressionist/issues/305
- https://github.com/hotwired/turbo-rails/blob/main/lib/turbo/engine.rb