2007/07/19

Railsの処理フロー


Railsのソースをざっくり読んでみた。やっと仕組みの概要がわかった(気がする)のでまとめてみる。

違ってたら教えてくださいまし。

  1. ブラウザからリクエストがくる。
    例:http://www.example.com/recipe/list
  2. Apacheなどのドキュメントルートが/var/www/rails_app/publicであるとする。
    rails_appはrailsコマンドで生成したアプリケーションディレクトリ。
  3. publicディレクトリに生成される.htaccessでModRewriteによるリクエストURLの書き換えを行う。
    1. DocumentRoot(http://www.example.com)へのアクセスの場合、index.htmlへのアクセスに書き換える。
    2. ファイル部分に「.」が含まれないURL(たとえばhttp://www.example.com/recipe/list)場合、.htmlを付与(/recipe/list.html)する。
    3. 書き換えた結果のURLにマッチするファイルがある場合はそれを返す。(Railsを起動しない)
      これによりページキャッシュとして静的ファイルを出力しておいて高速化とかできる。
    4. 該当ファイルがない場合は、dispatch.cgiを起動する。
  4. dispatch.cgiではconfig/environment.rbやらboot.rbなどを読み込んでRailsに必要なライブラリのロードや、初期化を行う。
    その後railtie/lib/dispatch.rbのDispatcher#dispatchを呼び出す。
  5. リクエストからActiveController::CGIRequestとCGIResponseオブジェクトを生成する。
  6. Routesを呼び出してリクエストからどのコントローラを使用するか決定し、コントローラを生成して返す。
    http://www.example.com/recipe/listならばrecipeコントローラ。
    config/routes.rbでカスタマイズ可能。
  7. ActionController#processを呼び出す。
    processではsessionやparamsなどの初期化を行い、リクエストから該当するアクションを呼び出す。
    recipeコントローラのlistアクション(メソッド)
  8. アクションではモデル(ActiveRecord)の操作をしたり業務ロジックを実行する。
  9. 処理後、ActionViewのrenderを実行する。
    テンプレートを指定しない場合app/view/コントローラ名/アクション名.rhtmlのテンプレートをベースにレンダリングする。(app/view/recipe/list.rhtml)
    ActionControllerに設定したインスタンス変数はテンプレートでも使用できる。
  10. Dispatcherでresponse#out($stdout)でレスポンスを返す。

こんなところですかね?

0 件のコメント: