【问题标题】:Rails 3.1 mountable engine gem dependenciesRails 3.1 可挂载引擎 gem 依赖项
【发布时间】:2026-02-01 21:00:01
【问题描述】:

我正在为我的应用程序开发一个 api。 该 api 是一个可挂载的引擎。

我的问题是,如果没有在父应用程序 gemfile 中指定 gems,它们就不会加载到 api 引擎中。

我目前的设置:

父应用程序/Gemfile

gem 'api', :path => 'path/to/api'

parentapp/routes.rb

mount Api::Engine => '/api'

api.gemspec

$:.push File.expand_path("../lib", __FILE__)

require "api/version"

Gem::Specification.new do |s|
  s.name        = "api"
  s.version     = Api::VERSION
  s.authors     = ["Author"]
  s.email       = ["email"]
  s.homepage    = "http://example.com"
  s.summary     = "Summary"
  s.description = "Description"

  s.files = Dir["{app,config,db,lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.rdoc"]
  s.test_files = Dir["test/**/*"]

  # Is not loading.
  s.add_dependency 'rails', '~> 3.1.3'
  s.add_dependency 'rabl'
  s.add_dependency 'yajl-ruby'
end

api/test/dummy/config/routes.rb

Rails.application.routes.draw do

  mount Api::Engine => "/api"
end

奇怪的是它正在“加载”,因为如果我设置了

s.add_dependency 'rails', '~> 3.2'

它会引发错误。

如果我从父应用程序 gemfile 中删除 gem 'rabl',则堆栈跟踪。

NameError: uninitialized constant Rabl
~/Sites/api/config/initializers/rabl_init.rb:1:in `<top (required)>'
~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/engine.rb:556:in `block (2 levels) in <class:Engine>'
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/engine.rb:555:in `each'
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/engine.rb:555:in `block in <class:Engine>'
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/initializable.rb:30:in `instance_exec'
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/initializable.rb:30:in `run'
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/initializable.rb:55:in `block in run_initializers'
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/initializable.rb:54:in `each'
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/initializable.rb:54:in `run_initializers'
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/application.rb:96:in `initialize!'
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/railtie/configurable.rb:30:in `method_missing'
    ~/Sites/parentapp/config/environment.rb:5:in `<top (required)>'
    <internal:lib/rubygems/custom_require>:29:in `require'
    <internal:lib/rubygems/custom_require>:29:in `require'
    ~/Sites/parentapp/config.ru:3:in `block in <main>'
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/builder.rb:4:in `instance_eval'
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/builder.rb:4:in `initialize'
    ~/Sites/parentapp/config.ru:1:in `new'
    ~/Sites/parentapp/config.ru:1:in `<main>'
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/server.rb:50:in `eval'
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/server.rb:50:in `load_config'
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/server.rb:43:in `initialize'
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/server.rb:13:in `new'
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/server.rb:13:in `run'
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/bin/nack_worker:4:in `<main>'

这是我的 rabl_init.rb 文件,位于 config/initializers(在引擎中)

Rabl.configure do |config|
 config.include_json_root = false
end

如果我删除这个文件,我会得到Template is missing

Missing template api/v1/myresource/show, api/application/show with {:handlers=>[:erb, :builder, :coffee, :haml], :formats=>[:json]

不包括 rabl 处理程序,因此,未加载 rabl。

【问题讨论】:

  • 什么告诉你它没有加载?您能否发布有关症状/错误的更多详细信息?
  • 就像我在问题中所说:But if i remove it from parent_app it does not work.。如果 gem 未在父应用 gemfile 中指定,则它在我的引擎中不可用。
  • 我也不知道你的实际问题是什么......
  • 你能发布堆栈跟踪吗?我不明白为什么它不应该工作......
  • 用堆栈跟踪更新了问题并重新表述了我的问题。抱歉,如果我的问题的解释有些模糊。

标签: ruby-on-rails rails-engines rails-3.1


【解决方案1】:

我并没有像我应该的那样需要宝石。 在lib/api/engine.rb 中添加require "rabl" 解决了它。

【讨论】:

  • 你可以在 Gemfile 中完成:gem 'rabl', require: 'rabl'
  • 我很确定 Gemfile 不会工作,因为主要的 rails 应用程序不会查看引擎的 Gemfile
最近更新 更多