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の処理を呼び出している。