技術メモ RailsのMVCを理解する

f:id:piyo_yeah:20181202190633j:plain

Railsの把握には欠かせないMVCについて、自分の言葉で整理してみる。

学習するときは全体を抑えろ!

今注目している記事はコレ。
morizyun.github.io
プログラミングに限らず、何かを効率よく習得するには全体の構想が不可欠だ。
差し当たってRailsを勉強するうえで何が必要なのかを網羅し、それぞれの内容について資料を提供してくれている点で、この記事は学習者にとって最適と言えよう。

今回はこの記事で引用されている、下の記事の情報をメインに扱い、MVCについて自分なりに説明してみたい。
at-grandpa.hatenablog.jp

勉強する際のコツは、多様な角度で捉えること。今回は時系列で捉えてみよう。
今回の例では、Railsのプログラムを以下の2点で考えていく。
1、どのような順番でファイルが挙動するのか
2、データはどう遷移するのか

説明の都合により、RailsTutorialの2章「2.2.2 MVCの挙動」から下図を引用する。
f:id:piyo_yeah:20180711021805p:plain
因みに、この図は「/usersにあるindex ページをブラウザで開く」想定で書かれている。

有難いことに番号がついているので、これを基準に説明していこう。
番号ごとに
「全体として何を意味しているか」
「その裏側では実際にどんな処理が行われているか」
の二つを抑えていく。

これも勉強の大事なコツだ。
先ず全体を抑え、次にその中身を抑える
という発想があると勉強の効率が上がる。特にIT関連では必須の勉強法だ。

時系列でみるRailsの挙動

1, 人間がブラウザを使用して /users にアクセス
・アクセス時、config/routes.rb ファイルがその先の処理を任せる相手を決定する(Routing)
・当たり前だがインターネットにおけるRouting とは意味が異なる。

2, アクセス情報を元にどのコントローラに処理を割り当てるか、
 config/routes.rb ファイルが決定

・routes.rb ファイルはアクセス情報を元にして、params[:xxx]というハッシュ型データを作成し、割り当て先のコントローラのファイルにそのデータを渡す。これは自動で行われる。

3, DBから特定のデータを取り出すために、モデルのファイルに書かれた
 メソッドを指定し、モデルのファイルに処理を依頼

・コントローラのindex アクションに、@users = User.all と記載してある前提で話を進める。
・コントローラはDBから特定のデータを取り出したいので、app/models/user.rb ファイルに書かれたメソッドを指定し、user.rb ファイルに処理を依頼する
※上記のページにも書かれている通り、MVCにおいて誤解されやすいポイントの1つがココ。
・DBからデータを取り出すためのメソッドは、コントローラファイルではなくモデルファイルに記載されており、コントローラはそのメソッドを指定するだけである。

4, 指定されたメソッドを用いて、DBからデータを抽出
・DBにアクセスする際にSQL文を用いているが、RailsではActiveRecordという仕組みがあるから、SQL文を逐一書く必要がない。
・モデルのファイルは全て ApplicationRecord クラスを継承している。このApplicationRecord クラスにてSQL関連の処理が既に定義されているおかげで、エンジニアは楽が出来る。ActiveRecordという名称で調べてみてね。

5 & 6, 抽出したデータを@users 変数に格納
・コントローラのindexアクションに書かれている @users = User.all によって、Viewファイルにて @users という変数(インスタンス変数)が使用可能になる。
・Viewファイルはコントローラから値を受け取っているわけではなく、インスタンス変数として定義されているためにViewファイルからアクセス出来るようになっている、というのが正しいイメージ(多分)。
・変数のスコープについて調べると、なぜ @ を先頭につける必要があるのかがわかる。

7, ViewファイルがHTMLファイルを生成
※このあたりはよくわかっていないので省略。
・index.html.erb ファイルがindex.html を生成してくれるらしい、程度にしか理解してない。
・拡張子は勿論HTMLに限らず、XMLやJSONも可能。

8, ブラウザに対し、コントローラがHTMLファイルを送信
・あとはブラウザのソフトが人間にとって見やすいように情報を編集してくれる。

MVCの役割を理解すべき理由

大きく3つ。
1、Railsの言語の特徴として「暗黙の了解が多い」こと。
 COC(Convention Over Configuration)=設定よりも規約、という基本理念が有名。
 COCとは要するに「ルールをいっぱい決めておけば、エンジニアが書くコードの量が減るよね」という発想(賛否両論ありそうなまとめ方だが・・・)。
2、プログラミング言語の設計者が意図したとおりにコードを書けば、比較的ラクにアプリが作れること。
 この辺は説明しにくいから、経験積めとしか言えないかな・・・?
3、エンジニア同士が協同開発を行う上で、共通理解がとても重要であること。
 共通理解があれば協同するのが非常に容易になるからね。
 そもそもプログラムって楽をするために作ってるみたいなもんだからエンジニアにとって「如何に楽をするか」という発想は大前提。怠惰さがエンジニアとして大事だと言われるぐらい(これ真面目な話)。

終わり。またわかったことなどあれば追記するかもしれません。

哲学マンからのお願い

間違いがありましたら、是非とも指摘をお願いします!