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

时间:2013-04-30 15:34:38

标签: ruby-on-rails ruby rack

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

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

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 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

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

1 个答案:

答案 0 :(得分:1)

尽管有外观,该方法不仅返回空白哈希。 Hash.new constructor接受参数,并在缺少指定键时返回默认值。例如:

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

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