【问题标题】:Rails Engine add middleware to host app onlyRails 引擎仅将中间件添加到宿主应用程序
【发布时间】:2014-05-25 08:31:32
【问题描述】:

我正在开发一个 gem,它也是 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

但是,这也会将中间件添加到引擎的 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

我可能走错了路来实现这一点,也许我应该看看其他解决方案?

【问题讨论】:

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


    【解决方案1】:

    如果不将其放入引擎中,我不明白你怎么能做到这一点。初始化程序在启动时运行。如果 url 是 /engine,您可以在中间件中创建一个 URL 匹配器来跳过它所做的任何事情。请注意,我必须使用app.config.middleware.use,而不是app.config.app_middleware.use

    【讨论】:

    • 我在这方面使用 oma,中间件在到达 rails 路由器之前会影响堆栈,因此除非您在中间件中明确跳过引擎路由的中间件,否则中间件堆栈对您的引擎一无所知。跨度>
    • @j_mcnally 竖起大拇指!在不相关的注释上,查看我设置的其他 Q 的赏金。这真的很困扰我:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多