やる気がストロングZERO

やる気のストロングスタイル

Railsで実装した処理はどうやって実行されるのか

Railsで実装した処理は、どうやって実行されるのかが理解できたのでメモ。

わからなかったこと

ブラウザからリクエストが送出され、webサーバ(Nginx等)に到達し、webサーバからAppサーバ(Unicorn等)に流されるのは理解していた。
AppサーバがどうやってRailsで実装した処理を呼び出しているのかわからなかった。

Railsでは「こういうリクエストがあったとき、このメソッド(controller)が呼び出される」という取り決めがあるが、なぜそれが呼び出されるのか?
呼び出すのはおそらくAppサーバであるが、Appサーバ(Unicorn等)は別にRails専用というわけではないのになんでRailsのメソッドが呼び出されるようになっているのか?どこでそういう設定をしたのか?
Rackってよく説明で出てくるけど具体的になんなのか?

わかったこと

Railsの処理はAppサーバのプロセスとして実行される

Railsアプリケーションのプロセスが存在しているわけではなく、Appサーバのプロセスの中でRailsの処理は実行される。
Appサーバの処理の中で、Railsの処理が書かれたメソッドを直接呼び出している。

Rackはインターフェースで、これを実装しているオブジェクトをAppサーバは利用することができる

Rackはプログラミング言語のコンテキストで言われるインターフェースである。(もしかしたら「Rack仕様というものの一部にRackインターフェースがある」というような構造になってるかも)

Javaで書くと以下のイメージ

class SomeClass implements Rack {
...
}

Rubyにはインターフェースを表す構文が無く、Rackインターフェースを満たすようにメソッドを実装していればRackインターフェースを実装したことになる。(ダックタイピング)

Railsアプリケーションを表すオブジェクトRails.applicationはこのRackインターフェースを実装している。

そして、AppサーバはRackインターフェースを実装したオブジェクトを使うように実装されているので、Railsアプリケーションを使う(メソッドを叩く)ことができる。

どこでAppサーバにRailsの処理が呼び出されるように設定しているのか

Appサーバは起動時にconfig.ruというファイルを読み込む。(もしかしたらこれもRack仕様の一部かも)
Railsの場合、config.ruに以下のような記述がある。

require_relative 'config/environment'
run Rails.application

これによってAppサーバはRails.application(Rackインターフェースを実装している)の存在を認識し、リクエストが来たらRails.applicationのメソッドを呼び出し、Railsの処理を呼び出している。