前回までのプログラミング学習コラムに続き3回目の勉強内容です。
コラムの連載をさせていただいている小林寛和(ひろかず)です。Ruby on Railsのコラムの第3回目となります。
これはあくまでも文系エンジニアの私がどうやって学んだかを記録するものであり、もしかしたら大きく回り道をしている可能性もありますし、非効率的な学び方をしているかもしれません。
できるだけ丁寧に記録していきますので、どうか寛大な心で見守って頂ければと思います(笑)また、万が一技術的な内容で間違ったものを見つけた場合は是非ご連絡いただければ幸いです。
MVCとは何か
モデル・ビュー・コントローラー
MVCの解説に最適なサイトが有りましたので、まずはそのサイトをご紹介いたします。
RubyLife.jpさんのRuby on Rails入門が参考になるかと思います。
詳しくは上記サイトを参考にしていただきつつ、まとめると、下記のようになります。
- モデル: データベースと連携する為に書かれたRubyファイル
- ビュー: ブラウザに表示するHTMLを生成する為に書かれるHTML+Rubyのファイル
- コントローラー: ユーザーのブラウザからのレスポンスに応じて、コントローラー内のアクション(=メソッド)を実行する。ここからモデルやビューと連携を図る
コントローラーとアクションの関係
同じくRubyLife.jpさんのコントローラとアクションの作成とルーティングの設定のコラムを参考にまとめていきます。
コントローラー自体はRubyのクラスで、アクション自体はメソッドの形式で記載されます。
ドットインストールさんのブログを例に言えば、「rails g controller post」コマンドを入力すると「blog/app/controllers/」ディレクトリの中に「post」コントローラー(=「.rb」で終わるRubyファイル)が作成されます。このRubyファイルの中身は1つのクラスで構成されていました。このクラス自体がコントローラーということです。そしてその中に作成した「indexメソッド」や「showメソッド」がアクションになります。
ルーティングとアクションの関係
これらのアクションによってモデルと連携し、データベースからデータを引っ張ってきて、それをビューに受け渡しユーザーに表示するわけですが、アクション自体は基本的にはURLからコントローラー内のメソッドを呼び出して、実行します。
そのURLとメソッドを結びつけているのが「blog/config/」ディレクトリ内にある「routes.rb」というファイルに書かれているルーティングです。これらはルーティングといい、ユーザーからのリクエストとrailsの動作を結びつけるもので、様々な定義方法があります。
ブログサービスの場合は「resources :blogs」と記入して「rake db:migrate」を実行したことで、「index」や「show」といったルーティングが作成されたと思います。
コントローラーからビューを呼び出す
コントローラーとビューの関係に関してはRubyLife.jpさんのビューの作成とデータの受け渡しのコラムを参考にしてください。基本的には「blog/app/views/posts/」のディレクトリにテンプレートファイルを作成して、それを変更していく形になることが分かるかと思います。
このテンプレートファイルが「〜.html.erb」の形式のもので、アクション名に対応したテンプレートファイルを作成しました。ユーザーのリクエストからコントローラー内のアクションが呼び出され、モデルを使ってデータベースからデータを取り出し、それをビュー内に埋め込んでユーザーに表示するという一連の流れの最終段階に居るのが分かるかと思います。
また、この際にコントローラー内でクラス変数(「@」で始まる変数)を宣言しておくことで、その変数に格納されている情報をビューで取り扱うことが出来ます。
[例]
def index @posts = Post.all end
まとめ
今回は「MVC」モデルの簡単な解説を行いました。
- MVCの概略
- コントローラーとアクションの関係
- ルーティングとアクションの関係
- コントローラーからビューを呼び出す
今回題材に挙げたRubyLife.jpさんのRuby on Rails入門は非常にわかり易く説明がされているので、是非何度も読んで参考にしてみて下さい。Railsに限ったことではありませんが、プログラミングの概念的な部分はどうしてもわかりにくいので、絵や図を使って説明して頂けるとピンとくることが多いですよね。
次回予告
次回の連載では、MVCを使ってRailsがユーザーに情報を返す流れをドットインストールさんのブログサービスと絡めながら、より細かに解説していこうと思います。