关于ruby:rails如何覆盖机架定义的中间件方法?

how rails override the middleware method defined by rack?

这个问题是关于rails源代码的。

我注意到在railties / lib / rails / commands / server.rb(Rails)中定义的中间件方法

1
2
3
4
5
6
def middleware
  middlewares = []
  middlewares << [Rails::Rack::Debugger] if options[:debugger]
  middlewares << [::Rack::ContentLength]
  Hash.new(middlewares)
end

我认为它返回一个空的哈希{}。它会覆盖具有相同名称的方法,该方法在
lib /机架/server.rb

如果我跟踪正确,此方法由build_app调用,该方法在lib / rack / server.rb(机架)中定义

1
2
3
4
5
6
7
8
9
def build_app(app)
  middleware[options[:environment]].reverse_each do |middleware|
    middleware = middleware.call(self) if middleware.respond_to?(:call)
    next unless middleware
    klass, *args = middleware
    app = klass.new(app, *args)
  end
  app
end

我的问题是:中间件方法如何工作?


尽管出现了该方法,但它不仅返回空白哈希。 Hash.new构造函数采用参数,并确保在缺少指定键的情况下返回默认值。示例:

1
2
3
h=Hash.new([1])
h[:missing_key]
=> [1]

build_app方法正在调用middleware[options[:environment]]。因此,如果指定的环境不存在,则至少将获得最少的中间件集。