ruby-on-rails - Rails 引擎中的 Gem 依赖项

标签 ruby-on-rails ruby gem rails-engines

我已经关注了 Getting Started with Engines在 Rails 文档中,我在 engines 目录中设置了一个 api 引擎。根据段6.6 Other Gem Dependencies应该在 engines/my_api/my_api.gemspec 文件中定义 gem 依赖项,这几乎就是我所做的:

s.add_dependency "responders", "2.0"

添加后

`gem 'my_api', path: "engines/my_api"`

对于应用程序 Gemfile 和运行的 bundler ,一切看起来都符合预期:

 bundle install | grep responders
 Installing responders 2.0.0

在下一步中,我使用相应的 Controller 等设置根路径,然后转到 engines/my_api/app/controllers/my_api/application_controller.rb 并添加以下内容:

module MyApi
  class ApplicationController < ActionController::Base
    respond_to :json
  end
end

我启动 Rails 服务器,转到根 URL,你猜怎么着?我收到以下消息:

controller-level respond_to' 特性已经被提取到 responders gem。将它添加到您的 Gemfile 以继续使用此功能:gem 'responders', '~> 2.0' 请参阅 Rails 升级指南了解详细信息。

按照错误消息中的建议,我已将 gem 添加到应用程序 Gemfile 中,运行 bundle install,一切都按预期工作。

据我所知,引擎应该是独立的 Rails 应用程序。从一个独立的应用程序我至少期望正确解决它的依赖关系。我假设我只是做错了什么,我希望有人能够帮助我解决问题,为什么我必须在应用程序 Gemfile 中明确指定 gem?

编辑:

忘记提及版本:

$ gem list | grep rails
coffee-rails (4.1.0)
jquery-rails (4.0.3)
rails (4.2.1)
rails-deprecated_sanitizer (1.0.3)
rails-dom-testing (1.0.6)
rails-html-sanitizer (1.0.2)
sass-rails (5.0.3)
sprockets-rails (2.2.4)

最佳答案

如您所见,gem 包含在您的包中,无论它是否在您应用程序的 Gemfile 中。不同之处在于,当 Bundler.require 在应用程序初始化期间被调用时,它仅自动需要应用程序 Gemfile 中的 gem - 而不是间接依赖项。

如果您的 gem 需要加载 responders gem gem,那么它应该明确要求它 - 例如在 my_api.rb 的顶部

关于ruby-on-rails - Rails 引擎中的 Gem 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29805325/

相关文章:

mysql - 未定义方法 `code' 为 nil :NilClass message with rails and a legacy database

ruby-on-rails - Websocket-rails 无法从模型广播

Python 和 Ruby 解释器

ruby - 为 OmniAuth 查找加载的提供程序

ruby-on-rails - 无法解密config/credentials.yml.enc。也许您输入了错误的 key ?

ruby-on-rails - Rails 中复杂的多对多关系

ruby - Hash.new{[]} - 它有什么问题吗?

ruby - 我不想将 "rake install"发布到 Rubygems

ruby - 使 Spring gem 与 SimpleCov 一起工作

ruby-on-rails - 使用 RedCloth 4.2.2 gem 在 Rails 3.0.1 中未初始化的常量