Ruby / Rails

MVCについて詳しく解説

2019年7月2日

こんにちは、Nanayakuです。

今回は、MVCの流れについて詳しく解説していきます。

この記事で分かること

  • MVCのインスタンス変数の流れ
  • ログインするとき、MVCはそれぞれどのような処理をしているのか

目次

MVCの流れ

ざっとしたMVCの流れは、画像のようになっています。

今回は、ログインする時にどのような処理が行われているのか、1つ1つ解説していきます。

MVCの流れ

  1. ブラウザからのリクエスト(URL)をRailsサーバーが受け取り、Routesに送ります。
  2. Routesでは、URLとHTTPメソッド(GETなど)のマッチするコントローラーに処理を振り分けます
  3. コントローラーのアクション(def 〇〇〜end)の中にモデルへの処理があれば、モデルへ指示を出します。
  4. モデルはデータベースにデータ操作(取得・更新・削除など)の命令を出します。
  5. データベースは該当するデータをモデルに返します。
  6. モデルはデータベースから受け取ったデータをコントローラーに返します。
  7. コントローラーは得られたデータをViewに渡します。
  8. Viewはデータを元にHTMLを作成し、ブラウザに返します。

 

①リクエストを送る

ログインなどリンクを生成する時は、「link_toメソッド」を使います。

「link_toメソッド」の書き方は、以下のようになります。

<%= link_to '表示する文字(ログインなど)', パス(URL) , ' オプション(ボタンにするかなど) ' %>

パス(URL)は、「〇〇_path」と書き、〇〇はURLを書きます。

今回の場合は「new_user_path」となり、「/users/new」のURLでRoutesにアクセスする事を表しています。

これにより、ログインボタンを押すことで、/user/newにアクセス出来ます。

今回は、情報を取得するので「GET」の/user/newにアクセスします。

ここまでが①の部分で、ブラウザがログインボタンを押す(URLにアクセス)→Routesがその情報を受け取る部分になります。

 

②コントロールに振り分け

受け取ったURL情報は「config/routes.rb」ファイルで、コントローラーに処理を振り分けます。

このファイルの中で、「GET 'user/new'」の組み合わせに該当するコードを探します。(上から順番に処理していきます)

resources :users」は、usersへのアクセスをまとめたものになります。

今回は、これが該当します。(GET 'user/new')

2枚目に画像は、「config/routes.rb」でアクセスできるルートを表しています。

画像から「resources :users」で、usersコントローラーへのアクセスがまとめられているのがわかります。

これが②の部分で、RoutesからControllerへのアクセスになります。

 

③コントローラーからモデルへ命令

コントローラーのアクション(処理)でモデル(データベースなど)に関する記述がなければ、Viewに直接アクセスします。

ユーザーに関するデータは全てインスタンス変数の@userに代入されます。

@user(インスタンス変数)にデータを入れて、返してくれ」と命令を出しています。

createはユーザー情報を登録するときに使います。

これが③の部分で、コントローラーからモデルに命令を出す部分です。

 

④モデルがデータベースに命令

newメソッドは、クラスからインスタンスを生成するメソッドです。

Userモデルは、データベースに新しいレコード(IDなど)を作成する命令を出します。

ここまでが④の部分で、モデルからデータベースに命令を出す部分です。

 

⑤該当するデータを返す

画像のようなユーザーテーブルをモデルに返します。

これが⑤の部分で、モデルに操作したデータを返します。

 

⑥データをコントロールに返す

インスタンス変数(@user)に作成したテーブルを代入して、コントローラーに返します。

これが⑥の部分です。

 

⑦コントローラーに返されたデータをViewに渡す

Railsでは、コントローラーで実行されたアクション名と同じ名前のViewファイルが開くようになっています。

今回は、newアクションで得られたデータ(@user)をnew.html.erbに渡します。

これが⑦の部分です。

 

⑧Viewで生成したHTMLをブラウザで表示する

Rails・RubyのプログラムをHTMLに出力する方法の<%= %>を使います。(Railsとはなんぞや・・・!?

得られたデータはインスタンス変数の@userに入っているので、HTMLで出力するには以下のように書きます。

<%= @user %>

今回は、新規登録になるので、下のような登録フォームの形になります。

<%= form_for @user do |f| %>

<% end %>

本来、formタグは「action」でアクセス先を指定しなければなりません。

しかし、上記のform_for構文は、引数にレコードを指定すると自動で「action」を指定します。

今回の場合、「@user = User.new」で定義されているので、「action=”/users”」が生成されます。

もし、現在ログインしている状態(ユーザーのレコードのIDが3)のとき、インスタンス変数は@user=user.currentとなり、「action="/user/3"」が生成されます。

簡単に言うと、レコードのデータが空なら新規登録すると判断して、そこにアクセスするように作成します。

また、レコードデータが存在したら更新するのかと判断して、そこにアクセスするように作成します。

 

最後に

備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。

-Ruby / Rails
-

© 2024 Nanayaku blog Powered by AFFINGER5