📝

Railsのルーティング制御

2021/02/24に公開

なに?

リクエストURLからどのようにしてControllerのActionが呼び出されるかを調べた。

ばーじょん

  • Ruby ruby 2.7.2p137
  • Rails 6.1.2

ながれ

  1. Rails起動時にルーティングリローダーの設定が行われるときに、ルーティング情報が読み込まれる
    => ファイル更新検知と連動しており、検知したらリロードが行われる。
  2. Journey::Router::Utils.normalize_pathでpathをノーマライズ
    => /始まりにしたり、末尾の/を除去したりする。
  3. ルーティングで設定されたパスとリクエストパスが、HTTP Methodを含めて一致するかを1つずつチェックする
    => パスは、ルーティング情報を読み込んだときの正規表現とマッチするかをチェック
  4. 3で見つかったルーティングは、precedenceという処理順があるので、数字の小さい順で処理をしていく
  5. 見つかったルーティングに設定されているControllerクラスのインスタンスを生成し、dispatchする。
    インスタンス自体をキャッシュしているわけではないので、コード変更が即座に反映される。
    ControllerのActionで、インスタンス変数を使ってViewに値渡しできる理由はここにある。
  6. 5でレスポンスヘッダーにX-Cascade: passが設定されている場合は4に戻る。設定されていない場合は7に進む。
    # `/`に指定したActionで以下のように設定すると、Railsのwelcome画面が表示される
    response.headers['X-Cascade'] = 'pass'
    
  7. 6のレスポンスを返す

routes.rbに関しては、Rails Guide等に十分な説明があるので、ここでは触れない。

Discussion