こんにちは、偶然当たりカフェを見つけたShinyaです
今回はRuby on Railsって何だよ」の解決企画の第三弾としてRuby on Railsの「コントローラー」について解説していきます
これまで通り、分かりやすさを信条に書いていきます!
コントローラーとはMVCのCのこと

まずコントローラーの中身を見る前に、Ruby on Railsにおけるコントローラーの位置づけを軽ーく見ておきます
Ruby on Railsは
- モデル(Model)
- ビュー(View)
- コントローラー(Controller)
という異なる役割を持った3要素が連携することで機能します
この3要素の連携を指してMVC構造といいます(MVCは3要素の頭文字です、MVCアーキテクチャとも)
MVC構造と言うと難しそうだけど、MとVとCが連携してるよ~ってことだけ分かればOKです
ほな、コントローラーは何するものぞ?

コントローラーはモデルとビューを繋ぐものです
(参考:モデルの解説記事、ビューの解説記事)
もう少し詳しく説明します。まず前提を整理します
モデルは主にデータベースと連携して、システム内の「もの」の情報を設定する部分です
一方、ビューは利用者がブラウザを通してシステムとやり取りすることを可能にする窓口的存在です
利用者はビューから様々な指示を出します
そのため、ビューはモデル経由でデータベースからデータを貰ったり、逆に入力内容を渡したりする必要がありますが、ビューとモデルは直接やり取りできません
そこでコントローラーの出番です
コントローラーはビューで受けた指示に応してモデルとデータをやり取りする役割を担います
モデルとコントローラーは1対1

ここまでモデル、コントローラーを一括りにしてきましたが、通常ひとつのWebサービスには複数のモデルと対応する複数のコントローラーがあります
例えばTwitterのようなWebサービスなら
- ユーザーモデルとユーザーコントローラー
- つぶやきモデルとつぶやきコントローラー
のように1対1の関係でモデルとコントローラーが作られます
なぜか
一つのコントローラーで複数のモデルに対応するとコントローラーを管理しにくいからと考えられます
モデルごとに専属のコントローラーがあれば役割がはっきりするので保守性が高まります
コントローラーは複数のアクションを持つ
コントローラーは複数のアクションを持ちます
アクションというのは何かしらの処理のことです
アクションは利用者からの指示に応じて実行されます
例えば
- ビューに入力されたデータをデータベースに登録する(Create)
- データベースのデータを読み込んでビューに表示する(Read)
- ビューで指示された通りにデータベースのデータを書き換える(Update)
- ビューで指示された通りに データベースのデータを削除する(Delete)
などが代表的なアクションです
本題から少し逸れますがこの4つのアクションはデータベースを扱うシステムにおいて不可欠の基本的な処理なので、各アクションの頭文字をとってCRUD処理と呼ばれています
(参考記事: CRUD処理含むルーティング設定にはresourcesが便利 )
URLに応じてコントローラーとアクションが選ばれる
コントローラーはアクションを持っていますが、利用者にはビューしか見えていません
見えていないどころか、コントローラーとアクションの存在すら知りません
では、利用者はどうやってブラウザからコントローラーに指示を伝えているのでしょうか?
その方法はURLです
Ruby on Railsでは要求されたURLに応じてコントローラーとアクションが決まります
つまりURLとコントローラー・アクションの対応表があると考えてください
URL1 | Aコントローラー | Xアクション |
URL2 | Aコントローラー | Yアクション |
URL3 | Bコントローラー | X'アクション |
... |
URLに応じて処理のルート(route)を決定することから、この対応関係を「ルーティング」といいます
コントローラーの動きを具体的に理解するために、Twitterのつぶやきをする場面を考えます
S君はつぶやき欄に「プログラミング楽しい!」と入力をして、投稿ボタンを押しました
投稿ボタンは実は特定のURLをサーバーに要求していました
このURLをつぶやき投稿URLと仮に呼びます
つぶやき投稿URLはルーティングでつぶやきコントローラーの投稿アクションに対応していました
つぶやき投稿URL | つぶやきコントローラー | 投稿アクション |
従って、つぶやきコントローラーは投稿アクションを実行しました
投稿アクションにより「プログラミング楽しい!」という投稿はつぶやきモデルと繋がっているつぶやきテーブルに登録されました
つぶやき登録後「投稿を完了しました」というメッセージがビューに送られました(これも投稿アクションの一部)
S君は「投稿を完了しました」というメッセージが出たのを見て安心しました
Ruby on Railsはこのように
「利用者が要求するURLに対応するコントローラーのアクション」が一連の処理を実行する仕組みになっています
以上でコントローラーについての説明を終わります
ついに3記事に渡るモデル・ビュー・コントローラーの説明が終わりました
この3要素(MVC)はRuby on Railsの根幹です
順に読めば知らない人でもRuby on Railsの全体像がざっと掴めると思います
というか、そうあって欲しいです(笑)
なのでモデルとビューの記事がまだの人はぜひ読んでみてくださいね~
長い記事を最後まで読んでくださりありがとうございました。では、また!