Rails Engine仅将中间件添加到主机应用程序

时间:2014-04-11 09:12:38

标签: ruby-on-rails ruby rack middleware rails-engines

我正在开发一个同样是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

但是,这也会将中间件添加到Engine的routes.rb文件中定义的那些路由中。我怎么能避免这个?我只希望将中间件添加到主机应用程序中。

例如,请考虑在主机应用程序中定义的以下路由

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

/engine下的所有内容都不应通过MyMiddleware

我可能会走错路来实现这个目标,我可能会考虑其他解决方案吗?

1 个答案:

答案 0 :(得分:3)

我不知道如何在不将它放入发动机的情况下做到这一点。初始化程序在引导时运行。您可以在中间件中创建一个URL匹配器,以便在URL为/ engine时跳过它所做的任何操作。请注意,我必须使用app.config.middleware.use,而不是app.config.app_middleware.use