0

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

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

def middleware
  middlewares = []
  middlewares << [Rails::Rack::Debugger] if options[:debugger]
  middlewares << [::Rack::ContentLength]
  Hash.new(middlewares)
end

我认为它返回一个空白哈希 {}它覆盖了在lib/rack/server.rb中定义的同名方法

如果我追踪正确,这个方法由build_app调用,它在lib/rack/server.rb ( Rack )中定义

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

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

4

1 回答 1

1

该方法不只是返回一个空白哈希,尽管出现了。构造Hash.new函数接受参数并在缺少指定键时返回默认值。例子:

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

build_app方法正在调用middleware[options[:environment]]. 所以如果指定的环境不存在,它至少会取回一组最小的中间件。

于 2013-05-06T09:04:00.890 回答