Подтвердить что ты не робот

Как использовать промежуточное ПО от двигателя в двигателе

Из-за того, как различные камни взаимодействуют в моей системе, у меня есть двигатель, установленный на приложение rails. Недавно я начал работу над новым камнем, который обеспечивает некоторые функции промежуточного программного обеспечения.

Пример:

BaseApp
\
  Engine
  \
   NewMiddlewareEngine

# BaseApp/Gemfile
gem 'Engine'

# Engine/Gemfile
gem 'NewMiddlewareEngine'

# rake middleware output:
[email protected][BaseApp]$ bundle exec rake middleware
use Rack::Sendfile
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x6ebf30e1>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use CatchJsonParseErrors
use ActionDispatch::ParamsParser
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
run BaseApp::Application.routes

Однако я не могу заставить NewMiddlewareEngine отображаться в промежуточном программном обеспечении. Я протестировал это:

BaseApp
\
 NewMiddlewareEngine

# BaseApp/Gemfile
gem 'NewMiddlewareEngine'

# rake middleware output:
[email protected][BaseApp]$ bundle exec rake middleware
use Rack::Sendfile
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x2f9795d8>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use CatchJsonParseErrors
use ActionDispatch::ParamsParser
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use NewMiddlewareEngine    # Notice it mounts fine on it own
run BaseApp::Application.routes    

и

BaseApp
\
 Engine

# BaseApp/Gemfile
gem 'Engine'

# rake middleware output:
[email protected][BaseApp]$ bundle exec rake middleware
use Rack::Sendfile
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x6ebf30e1>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use CatchJsonParseErrors
use ActionDispatch::ParamsParser
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
run BaseApp::Application.routes

Оба из них работают нормально. Проблема в том, что я пытаюсь подключить NewMiddlewareEngine через "Двигатель".

Кто-нибудь знает, как настроить что-то вроде этого?

Здесь MyMiddlewareEngine:

module MyMiddlewareEngine
  class Railtie < Rails::Railtie
    initializer "add_my_middleware_engine_route_middleware" do |app|
      app.middleware.use 'MyMiddlewareEngine'
    end
  end
end
4b9b3361

Ответ 1

Из документация Rails:: Engine Edge API:

 class MyEngine < Rails::Engine
   # Add a load path for this specific Engine
   config.autoload_paths << File.expand_path("../lib/some/path", __FILE__)

   initializer "my_engine.add_middleware" do |app|
     app.middleware.use MyEngine::Middleware
   end
 end

Я имею тенденцию настраивать промежуточное программное обеспечение rails для запуска на уровне приложения, а не в движке (в качестве разделения обязанностей). Я использовал этот подход для раздельной аутентификации из установленного приложения rails (см. пример). Конфигурация для этого находится в application.rb:

 module MyApp
   class Application < Rails::Application
     ..
     config.middleware.use NewMiddlewareEngine

Вы видите какие-либо исключения при запуске консоли rails? Вы пытались использовать имя константы, как указано выше, вместо String?