【问题标题】:Rails 5: Rack app mounted in routes.rb bypasses Rails middleware?Rails 5:安装在 routes.rb 中的机架应用程序绕过 Rails 中间件?
【发布时间】:2016-10-29 22:19:21
【问题描述】:

我的routes.rb 中安装了一些 Rack 应用程序,如下所示:

mount ImageVise, at: '/ivise'
mount ShaderApiV0, at: '/api/v0'

我目前正在从意大利面条式自定义 Rack 堆栈迁移到 Rails,因此保留这些应用程序对我来说很有意义。我注意到在应用程序上定义的整个 Rails 中间件堆栈(包括我的 Rack::Cache 设置)在我调用控制器时确实起作用,但是当我调用由这些控制器控制的 URL 时 不起作用迷你应用程序。我几乎可以肯定在 Rails 4 中它确实有效。

例如,如果我像这样引入自定义中间件:

class Mittel < Struct.new(:app)
  def call(env)
    a, b, c = app.call(env)
    b['X-Kustom'] = 'olala'
    [a,b,c]
  end
end
config.middleware.insert_before Rack::Head, Mittel

当我请求一个由 Rails 控制器驱动的 URL 时,我确实看到了 X-Kustom 响应标头,但是当我请求一个由挂载的 mini 控制的 URL 时,我确实没有得到它-应用。因此,有条件的 GET 和类似的东西不起作用等等。除了在 config.rb 中复制三分之一的 Rails 中间件堆栈并将这些应用程序挂载到那里之外,我怎样才能使它工作?

【问题讨论】:

    标签: ruby-on-rails sinatra rack


    【解决方案1】:

    找到了。事实证明,我也在 config.ru 中安装了其中一个应用程序,在同一个 URL 下 - 然后整个 Rails 堆栈当然会被绕过,这是应该的。经验教训。

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 2012-03-22
      • 2017-03-25
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多