无法在应用中安装新生成的 Rails 引擎

Can't mount newly generated Rails engine in an app

我有一个复杂的 Rails 应用程序,我想将一些核心功能提取到引擎中,以便我可以在其他 Rails 应用程序中重用模型等。

我一直在关注引擎的官方文档 (https://guides.rubyonrails.org/engines.html)。我能够在应用程序中创建一个新引擎并生成一些测试模型

> rails plugin new testengine --mountable

testengine> rails generate model Test

这是 .gemspec

require_relative "lib/testengine/version"

Gem::Specification.new do |spec|
  spec.name        = "testengine"
  spec.version     = Testengine::VERSION
  spec.authors     = ["Me"]
  spec.summary     = "testengine"

  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
  # to allow pushing to a single host or delete this section to allow pushing to any host.
  spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"

  spec.files = Dir["{app,config,db,lib}/**/*", "Rakefile", "README.md"]

  spec.add_dependency "rails", "~> 6.1.4"
end

我在 testengine 中控制台进入测试虚拟 rails 应用程序,我可以在 Testengine::Test 找到我的新模型,没问题。到目前为止一切顺利。

现在我进入 4.1 安装引擎 部分。我通过 Gemfile 文件添加引擎(事实上这已经为我完成了,感谢上面的 rails 生成器)。

gem 'testengine', path: 'testengine'

然后我安装我的 gems 没有问题。

> bundle install
...
Using testengine 0.1.0 from source at `testengine`
...

我通过控制台进入主应用程序,我可以找到 TestengineTestengine::VERSION,但找不到 Testengine::EngineTestengine::Test

进一步阅读文档说您需要将此行添加到 config/routes.rb

mount Testengine::Engine, at: "/testengine"

我这样做了,现在 rails 应用甚至无法启动

config/routes.rb:3:in `block in <top (required)>': uninitialized constant Testengine::Engine (NameError)

我错过了什么?

我会回答我的问题,以帮助可能犯与我相同错误的其他人。在我的例子中,gem 'testengine', path: 'testengine' 被埋在一组宝石中,例如在

group :test do
    ...
end

我想我对 rails 如何从组中加载 gems 感到困惑,并且错过了有关组包含的详细信息。看起来虽然它会在 bundle install 期间显示在列表中并自动加载一些基本项目,例如 Testengine::VERSION 它不会自动加载所有内容,除非你是 运行 相同的环境名称作为组。事后看来,这似乎有点显而易见。吸取教训。