繁体   English   中英

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

[英]how rails override the middleware method defined by rack?

这个问题是关于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.rbRack )中定义

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构造函数接受参数,并确保在缺少指定键的情况下返回默认值。 例:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM