0

この質問は、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/rack/server.rbで定義されている同じ名前のメソッドをオーバーライドします。

私が正しくトレースした場合、このメソッドはlib/rack/server.rb ( Rack )で定義されたbuild_appによって呼び出されます

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 に答える