12

ラックは指定します

Rackアプリケーションは、呼び出しに応答するRubyオブジェクト(クラスではありません)です。

したがって、単純なconfig.ruものは次のようになります。

class MyApp
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello from Rack!\n"]]
  end
end

run MyApp.new

Railsはこれを生成します:

# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
run RailsApp::Application

だから、私は疑問に思っています:run RailsApp::Application.newRackがそれをクラスではなくオブジェクトとして指定するのはなぜですか?Rails::Application私が見逃していることについて何か特別なことはありますか?

4

2 に答える 2

19

これは確かに少し隠されています:)

RailsApp::Applicationはの子クラスでありRails::ApplicationRails::EngineこれはRails::Railtie。です。これで、子クラスがRailtieクラス(この場合)から継承するたびに呼び出されるフックができRails::RailtieましinheritedEngine

このコールバックには、Rails::Railtie::Configurableモジュールがサブクラスに含まれます。このモジュールでは、魔法の最初の部分を見つけます。

クラスで定義されたmethod_missingメソッドは、クラスのインスタンスでメソッドを呼び出します。これは、多かれ少なかれ解決されます。

RailsApp::Application.new.call(...)

このcallインスタンスメソッドはで定義されてRails::Application#callおり、一般的なラック処理を実行します。

おそらくまだもう少し魔法が関係しているので、100%同等ではありませんが、大まかに言うと...

于 2013-03-22T15:00:13.753 に答える
1

クラスもオブジェクトです。Rackはアプリオブジェクトをインスタンス化しません(そのため、オブジェクトを提供する必要があると指定されています)。そのconfig.ruため、Rackが「call」を送信するときにRailsクラスオブジェクトがすべてのRackルールに従う場合は、インスタンス化しないでください。問題。

内部的には、Railsがで特別なことをするかどうかはわかりませんcall。アプリケーションクラスのインスタンスを吐き出し、それを実行するファクトリメソッドである可能性もあります。ただし、Rackを満たす必要はありません。

于 2013-03-22T14:55:16.467 に答える