Rubyちゃんこんにちわ

子育てエンジニアが綴る

Rack の config.ru と Rack アプリについて

Rails のソースを読むにあたって、Rack の動作を前提知識として知っておこうと思う。なぜなら Rails は Rack アプリであるため。
実はちょっと前に調べていたことを忘れていたので、それの復習という意味も兼ねてメモしておきます。

参考にした記事はこちら。
第23回 Rackとは何か(1)Rackの生まれた背景
第24回 Rackとは何か(2)Rackの使い方

config.ru の使われ方

上記記事にも書いてあるように、config.ru に書いたコードは、Rack::Builder の new に渡されるブロックとなります。
ちょっとだけ追ってみましたが、Rack::Builder のクラスメソッド parser_file にて、config.ru を読み込み、initialize メソッドでは読み込んだ中身をブロックとして受けて、instance_eval しています。
このようにして Rack アプリを読み込んでいます。Rails でも同様の仕組みを用いています。

Rack アプリを満たすには

こちらも上記記事に書かれている通りですが、call メソッドがあってレスポンスが返れせれば Rack アプリの条件を満たせます。そのため以下のようなコードでも rackup コマンドで動きます。

このコードは Rack のコメントに載っていたものですが、lambda で生成した Proc オブジェクトは call メソッドを持っているため条件を満たしています。そのため Rack アプリとして扱うことができます。このシンプルさは好きです。
Rails でも、Rails アプリの継承元である Rails::Application や、さらにその継承元である Rails::Engine は call メソッドを定義していますので、Rack アプリとして定義されていることが理解できます。

最後に

ど忘れ結構怖いし時間無駄にするので、こまめにメモしていきたい。