Rails Engine добавляет промежуточное ПО только для хост-приложения

Я разрабатываю драгоценный камень, который также является Rails::Engine

Я хотел бы, чтобы движок добавлял пользовательское промежуточное ПО в хост-приложение, и я сделал это с помощью следующего кода.

module MyModule
  class Engine < ::Rails::Engine
    isolate_namespace MyModule

    initializer "my_gem.middleware" do |app|
      app.config.app_middleware.use "MyModule::MyMiddleware"
    end
  end
end

Однако это также добавляет промежуточное ПО к тем маршрутам, которые определены в файле route.rb Engine. Как я могу этого избежать? Я только хочу, чтобы промежуточное программное обеспечение было добавлено в хост-приложение.

Например, рассмотрим следующие маршруты, определенные в хост-приложении.

Rails.application.routes.draw do
  mount MyModule::Engine => "/engine"
  root :to => Proc.new { |env| [200, {'Content-Type' => 'text/html'}, ["Hello World"]] }
end

Все, что ниже /engine, НЕ должно проходить через MyMiddleware

Я, вероятно, иду по неправильному пути, чтобы добиться этого, и, может быть, мне следует поискать какое-то другое решение?


person user3522914    schedule 11.04.2014    source источник


Ответы (1)


Я не понимаю, как это можно сделать, не вставляя его в двигатель. Инициализатор запускается при загрузке. Вы можете создать средство сопоставления URL-адресов в своем промежуточном программном обеспечении, чтобы пропускать все, что оно делает, если URL-адрес /engine. Обратите внимание, что мне пришлось использовать app.config.middleware.use, а не app.config.app_middleware.use

person oma    schedule 20.08.2014
comment
Я согласен с oma в этом, промежуточное ПО влияет на стек до того, как попадет в маршрутизатор rails, поэтому, если вы явно не пропустите его в промежуточном ПО для маршрутов движка, стек промежуточного ПО ничего не знает о вашем движке. - person j_mcnally; 20.08.2014
comment
См.: stackoverflow.com/questions /12679644/ - person j_mcnally; 20.08.2014
comment
@j_mcnally палец вверх! на несвязанной ноте, проверьте награду за другой Q, который я установил. Меня это очень беспокоит :) - person oma; 20.08.2014