Ruby on Rails アプリケーション フロー
ミハイロミロバノビッチ/ゲッティイメージズ
01/07
Rails アプリケーション フロー
独自のプログラムを最初から最後まで書いているときは、簡単に確認できます。 フロー制御 .プログラムはここから始まり、そこにループがあり、ここにメソッド呼び出しがあり、すべてが表示されています。しかし、Rails アプリケーションでは、物事はそれほど単純ではありません。どんな種類のフレームワークでも、「フロー」などの制御を放棄して、複雑なタスクを実行するためのより高速または単純な方法を優先します。 Ruby on Rails の場合、フロー制御はすべて舞台裏で処理され、残されるのは (多かれ少なかれ) モデル、ビュー、およびコントローラーのコレクションだけです。
02/07HTTP
Web アプリケーションの中核は HTTP です。 HTTP は、Web ブラウザーが Web サーバーと通信するために使用するネットワーク プロトコルです。これが「リクエスト」、「GET」、「POST」などの用語の由来であり、このプロトコルの基本的な語彙です。ただし、Rails はこれを抽象化したものであるため、これについてはあまり説明しません。
Web ページを開く、リンクをクリックする、または Web ブラウザーでフォームを送信すると、ブラウザーは TCP/IP 経由で Web サーバーに接続します。次に、ブラウザはサーバーに「リクエスト」を送信します。これは、ブラウザが特定のページに関する情報を求めて記入するメールフォームのようなものだと考えてください。サーバーは最終的に Web ブラウザに「応答」を送信します。 Ruby on RailsはWebサーバーではありません. コマンドライン ) を Apache HTTPD (ほとんどの Web を動かしている Web サーバー) に接続します。 Web サーバーは単なるファシリテーターであり、リクエストを受け取り、それを Rails アプリケーションに渡します。Rails アプリケーションはレスポンスを生成し、それをサーバーに返します。その後、サーバーはそれをクライアントに送り返します。というわけで、ここまでの流れは次のとおりです。
クライアント -> サーバー -> [Rails] -> サーバー -> クライアント
しかし、'Rails' は私たちが本当に興味を持っているものです。そこをさらに掘り下げてみましょう。
03/07
ルーター
Rails アプリケーションが要求に対して最初に行うことの 1 つは、ルーターを介して要求を送信することです。すべてのリクエストには URL があり、これが Web ブラウザのアドレス バーに表示されます。ルーターは、URL が意味を成すかどうか、および URL にパラメーターが含まれているかどうか、その URL で何を行うかを決定するものです。ルータはで設定されています config/routes.rb .
まず、ルーターの最終的な目標は、URL をコントローラーとアクションに一致させることであることを理解してください (これらについては後で詳しく説明します)。また、ほとんどの Rails アプリケーションは RESTful であり、RESTful アプリケーション内のものはリソースを使用して表現されるため、次のような行が表示されます。 リソース :投稿 典型的なRailsアプリケーションで。これは次のような URL に一致します。 /投稿/7/編集 Posts コントローラーでは、 編集 ID 7 の Post に対するアクション。ルーターは、リクエストの送信先を決定するだけです。したがって、[Rails] ブロックを少し拡張できます。
ルーター -> [Rails]
04/07
コントローラー
ルーターは、要求を送信するコントローラーと、そのコントローラーのどのアクションに送信するかを決定したので、要求を送信します。コントローラーは、関連するアクションのグループであり、すべてがクラスにまとめられています。たとえば、ブログでは、ブログ投稿を表示、作成、更新、および削除するためのすべてのコードが、'Post' というコントローラーにまとめられています。行動は至って普通 メソッド このクラスの。コントローラーは次の場所にあります。 アプリ/コントローラー .
では、Web ブラウザが次のリクエストを送信したとします。 /posts/42 .ルーターは、これが 役職 コントローラー、 見せる メソッドと表示する投稿の ID は 42 を呼び出すので、 見せる このパラメータを持つメソッド。の 見せる メソッドは、モデルを使用してデータを取得し、ビューを使用して出力を作成する責任を負いません。したがって、拡張された [Rails] ブロックは次のようになります。
ルーター -> コントローラー#アクション05/07
モデル
このモデルは、理解するのが最も簡単であると同時に、実装するのが最も困難です。モデルは、データベースとのやり取りを担当します。これを説明する最も簡単な方法は、モデルが、データベースからのすべての対話 (読み取りと書き込み) を処理するプレーンな Ruby オブジェクトを返す単純なメソッド呼び出しのセットであることです。ブログの例に従うと、コントローラーがモデルを使用してデータを取得するために使用する API は次のようになります。 Post.find(params[:id]) .の パラメータ ルーターが URL から解析したもので、Post がモデルです。これにより、SQL クエリが作成されるか、ブログ投稿を取得するために必要な処理が行われます。モデルは次の場所にあります アプリ/モデル .
すべてのアクションでモデルを使用する必要があるわけではないことに注意してください。モデルとの対話は、データをデータベースからロードするか、データベースに保存する必要がある場合にのみ必要です。そのため、小さなフローチャートの後に疑問符を付けます。
Router -> Controller#action -> Model?06/07
景色
最後に、HTML の生成を開始します。 HTML は、コントローラー自体によって処理されることも、モデルによって処理されることもありません。 MVC フレームワークを使用するポイントは、すべてを区分化することです。データベース操作はモードのままで、HTML 生成はビューのままで、コントローラー (ルーターによって呼び出される) はそれらの両方を呼び出します。
HTML は通常、埋め込まれた Ruby を使用して生成されます。 PHP、つまり PHP コードが埋め込まれた HTML ファイルに精通している場合、組み込み Ruby は非常によく知られています。これらのビューは次の場所にあります。 アプリ/ビュー 、コントローラーはそれらのいずれかを呼び出して出力を生成し、それを Web サーバーに送り返します。モデルを使用してコントローラーによって取得されたデータは、通常、次の場所に保存されます。 インスタンス変数 これは、いくつかの Ruby マジックのおかげで、ビュー内からインスタンス変数として使用できるようになります。また、埋め込まれた Ruby は HTML を生成する必要がなく、あらゆるタイプのテキストを生成できます。これは、RSS や JSON などの XML を生成するときに表示されます。
この出力は Web サーバーに送り返され、Web ブラウザに送り返されてプロセスが完了します。
07/07全体像
以上で、Ruby on Rails Web アプリケーションへのリクエストの完全なライフサイクルを以下に示します。
- ウェブブラウザ - ブラウザーは、通常、ユーザーがリンクをクリックしたときに、ユーザーに代わって要求を行います。
- Web サーバー - Web サーバーはリクエストを受け取り、それを Rails アプリケーションに送信します。
- ルーター - リクエストを確認する Rails アプリケーションの最初の部分であるルーターは、リクエストを解析し、呼び出すコントローラー/アクションのペアを決定します。
- コントローラー - コントローラーが呼び出されます。コントローラーの仕事は、モデルを使用してデータを取得し、それをビューに送信することです。
- モデル - データを取得する必要がある場合、モデルを使用してデータベースからデータを取得します。
- ビュー - データはビューに送信され、そこで HTML 出力が生成されます。
- ウェブサーバー - 生成された HTML がサーバーに送り返され、Rails はリクエストを処理します。
- Web ブラウザ - サーバーはデータを Web ブラウザに送り返し、結果が表示されます。