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