RailsConf 2009で学んだことを基に、アプリケーションの書き直しに取り組んでいます。モデル、コントローラー、ビューが相互に関連していることを理解しています。しかし、私が苦労したことの1つは、コントローラーの「適切な」レベルです。
Railsモデルが(大まかに)データベーステーブルにマップされている場合...そしてRailsビューが(大まかに)ブラウザページにマップされている場合...
Rails Controllerは何にマップしますか?
RailsConf 2009で学んだことを基に、アプリケーションの書き直しに取り組んでいます。モデル、コントローラー、ビューが相互に関連していることを理解しています。しかし、私が苦労したことの1つは、コントローラーの「適切な」レベルです。
Railsモデルが(大まかに)データベーステーブルにマップされている場合...そしてRailsビューが(大まかに)ブラウザページにマップされている場合...
Rails Controllerは何にマップしますか?
コントローラーは、ソリューションのロジック、制約、および条件を使用してモデルをビューに接続する手段です。
したがって、ソリューションの「頭脳」にマッピングできると思います。
コントローラーは、探しているコンテキストの何にもマップされません。コントローラーは、モデルをビューに配置するために使用する接着剤と考える必要があります。
モデルはデータをレイアウトします。
ビューは、データの表現をレイアウトします。
コントローラーは、リクエストを受け取り、適切なモデルとビューを取得し、その結果をユーザーに提示する責任があります。
誰もがそれを接着剤や筋肉などに例えたいと思っていますが、モデルとビューの間のトランスレータであるため、それらのいずれにも当てはまりません. 筋肉は入力機能を提供するのではなく、出力、神経、および感覚のみがそのアナロジーで入力を提供します. 接着剤は 2 つのものを接着するだけで、それらを変更することはありません。
MVC のコントローラー層は、モデルからデータを取り出し、それをビューアーが表示できる形式に変換する役割を果たします。その完璧な例が 3 つの異なるページで、すべてが同じ (または非常に類似した) 形式でデータを表示しますが、表示されるデータは非常に異なるソースからのものです。これらのケースのそれぞれで同じビューコードが使用されている可能性がありますが、コントローラーは、モデルでさまざまな関数を呼び出して表示するデータを取得し、それを正しいコレクション名に入れて、ビューが見つけて表示できるようにすることを知っている人です。ビューは実際に表示されているものを認識していませんが。
ただし、コントローラー層のタスクはそれだけではありません。ユーザーの要求をモデルのアクションに変換する必要があるからです。ユーザーがリンクをクリックするか、フィールドに何かを入力するか、スライダーをスライドすると、モデルに対する 1 つ以上のアクションに変換される場合があります。意思決定の実際のビジネス ロジックであってはなりませんが、たとえば、「これを 3 回実行する」というチェック ボックスがあり、モデルに何かを実行する関数が 1 回しかない場合、コントローラーはモデルの関数を 3 回呼び出す責任があります。アクションを実行する回数。
類推が必要な場合は、マイケルの「頭脳」の答えを使用します。
コントローラーはマネージャーまたはコーディネーターです。モデルとビューは、企業内の 2 つの異なるグループ (営業と IT など) と考えてください。コントローラーは、2 人の上に座って、2 人が一緒にうまくプレイできるようにする人です。
そうは言っても、これらの比喩はすべて何らかの形で欠陥があります。たとえば、コントローラーは通常、ユーザーがログインする必要があるページにユーザーがログインしていることを確認します。これは、私のメタファーや他のいくつかのメタファーには当てはまりません。
特に RESTFUL リソースを使用する場合、コントローラは URL に密接にマップされます。
私は、URL をアプリケーションのコマンド ライン インターフェイスと考えています。
MVC のメタファーを探している場合は、最初に物事を簡単に理解するのに役立ちました。次のようなことを考えました。
モデル- あなたの骨格 (物事の構造を助ける)
コントローラー- 筋肉 (すべてを動かし、必要なタスクを実行するのに役立ちます)
ビュー- あなたの外見 (他の 2 つの部分が何をするかを世界がどのように見ているか)
それが、私が自分自身を「手に入れよう」にするための最も簡単な方法です。繰り返しますが、この部分のコントローラーは、アプリケーションで作業を行っているものすべてに「マップ」します。