2

这可能是一个人为的问题,但我正在研究 Rails API 并希望保持 API 中间件堆栈最小,同时提供需要一些更复杂中间件的 OAuth 端点。我的想法是把它做成一个引擎,并将该引擎包含在应用程序中。

但是,我认为创建 Rails 引擎会比生成新引擎 gem 并将 gem 包含在我的 Gemfile 中更简单。有没有办法只是......require 'lib/engines/my_engine'application.rb或什么?我不应该只需要一个 gemspec 来包含一个未构建的引擎 - 我可以将所有依赖项放在主应用程序的 Gemfile 中。

我真正想做的就是为一小组路由获取一个单独的中间件堆栈!

4

1 回答 1

2

我发现只要按照Rails::Engine 文档要求它就可以包含一个引擎:

确保此文件加载到 config/application.rb 的顶部(或 Gemfile 中)

所以我尝试了这个,它奏效了:

应用程序.rb:

# after Bundler.require(...)
require_relative '../lib/engines/oauth_server/lib/oauth_server'

所以这就回答了这个问题。从技术上讲,这种情况下所需的所有内容,而不是整个 gem 结构,是一个lib目录中的文件,该文件包含一个从 Rails::Engine 继承的类(它必须在lib其中以确保相邻的应用程序、配置、供应商等)。如果存在目录将自动包含在内)。当然,config/routes.rb如果您打算将此引擎用于任何事情,当然还有一个文件;)

例如,我的引擎(上面需要)看起来像这样:

module OauthServer
  class Engine < ::Rails::Engine
    middleware.use ActionDispatch::Cookies
    middleware.use ActionDispatch::Session::CookieStore
    middleware.use ActionDispatch::Flash
  end
end

但是,我还发现 Rails 引擎似乎继承了它所包含的应用程序的中间件,所以我回到我原来的问题,之前有人已经问过这个问题:在 Rails 应用程序中构建 2 个中间件堆栈

于 2017-01-06T22:24:56.720 回答