Как использовать Middleware из движка в движке
Из-за того, как различные драгоценные камни взаимодействуют в моей системе, у меня есть двигатель, установленный на приложение рельсов. Недавно я начал работать над новым гемом, который обеспечивает некоторую функциональность промежуточного программного обеспечения.
Вроде как это:
BaseApp
\
Engine
\
NewMiddlewareEngine
# BaseApp/Gemfile
gem 'Engine'
# Engine/Gemfile
gem 'NewMiddlewareEngine'
# rake middleware output:
user@laptop[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:
user@laptop[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's own
run BaseApp::Application.routes
А также:
BaseApp
\
Engine
# BaseApp/Gemfile
gem 'Engine'
# rake middleware output:
user@laptop[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
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 для запуска на уровне приложений, а не в движке (как разделение обязанностей). Я использовал этот подход для отделения аутентификации от приложения на смонтированных направляющих (см. Пример). Конфигурация для этого находится в application.rb
:
module MyApp
class Application < Rails::Application
..
config.middleware.use NewMiddlewareEngine
Видите ли вы какие-либо исключения, когда вы запускаете консоль rails? Вы пытались использовать имя константы, как указано выше, вместо String
?