背景 前提知識
MVCの流れを何回も忘れなるので忘れないようにしたい。
ファイルはある程度記載済みとする。
1. MVCをCMVと覚え直す
C コントローラー そのままの意味 普通はとりあえずコントローラーからスタートだよねのイメージ
M モデル 英単語だと雛形、原型の意味、そこからデータベースの雛形とイメージする
V ビュー 英単語だと景色の意味、そこから、ユーザーが見ている画面とイメージ
2.自分がWebサイトを見ていることを想像する
まずとあるURL(localhost:3000/tasks)にアクセスするとする。
ちなみにブラウザでURLを直接入力したり、リンクをクリックした場合は、仕様により必ずHTTPリクエストGETメソッドが発動する。
3. HTTPサーバがリクエストを受け取る
Railsアプリは通常、PumaなどのHTTPサーバ上で動いている。
このサーバが最初にリクエストを受け取り、Railsアプリケーションに処理を渡す。
4. ルーティング(地図のようなもの)ファイルに移動
ルーティングファイルに到着し中身を確認してみる。
get "tasks", to: "tasks#index"
これによるとlocalhost:3000/tasksにアクセスしてそれがgetメソッドなら
tasks コントローラーにある
の
index アクション
を
発動せよと書いてある。
5.コントローラー(C)に移動
class TasksController 以降省略
def index
@tasks = Task.all
end
Tasksコントローラー行ってみると、確かにindexアクションがある。
それによると
.allはモデルが持つ「全データ取得」メソッド
よってTasksはRailsの「モデル」クラス
6.モデルに移動(M)に移動
class Task < ActiveRecord::Base
end
ここには何も書かれていないが、親クラスはActiveRecordモジュールの中のBaseクラス。このBaseクラスがallメソッドを持っているため、Taskクラスもallメソッドを使える。
7.データベースに移動
ActiveRecordが Task.allを翻訳してくれ、「tasksテーブルの全データを取得するSQL文
SELECT * FROM tasks
を唱えて、データが取得できる。
このためSQLを意識せずにデータベース操作ができる。
8.コントローラー(C)に戻る
class TasksController 以降省略
def index
@tasks = Task.all
end
とってきたデータを@tasksに代入。
Rubyでは、変数名の先頭に@を付けると、それは「インスタンス変数」になる。
インスタンス変数を定義すると、その値はコントローラーのアクション内だけでなく、対応するビューでも使えるようになる。
3行目はTaskのモデルからallメソッド使ってデータを取得して、左辺は@か、じゃあビューに渡したいのねというイメージ
renderやredirect_to などの明示的な描画指示がなけばアクション名と同じ名前のviewテンプレートを自動的に探して描画する。例えば、PostsControllerのindexアクションならlocalhost:3000/views/posts/index.html.erbが自動的に呼び出される。
9. ビュー(V)に移動
とってきた@tasksは配列に似たオブジェクトなのでそれを分解して、htmlで表示する。