无法在应用中安装新生成的 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`
...
我通过控制台进入主应用程序,我可以找到 Testengine
和 Testengine::VERSION
,但找不到 Testengine::Engine
或 Testengine::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
它不会自动加载所有内容,除非你是 运行 相同的环境名称作为组。事后看来,这似乎有点显而易见。吸取教训。
我有一个复杂的 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`
...
我通过控制台进入主应用程序,我可以找到 Testengine
和 Testengine::VERSION
,但找不到 Testengine::Engine
或 Testengine::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
它不会自动加载所有内容,除非你是 运行 相同的环境名称作为组。事后看来,这似乎有点显而易见。吸取教训。