スクリーンショット_2019-03-23_1

【Rails】 RouterとMVC

※この記事は有料設定ですが、無料で全て読めます。
役に立ったら投げ銭してください。

Railsチュートリアル完走後の時の私が、「こんなことを教えてくれたらな」とか「こんなことを知りたかった」と思った内容を書きました。


web通信はHTTPリクエストとHTTPレスポンスのやりとりで実現されています。
サーバーはHTTPリクエストを受け取り(①)、それに応じたHTTPレスポンスを返す(②)わけですが、Railsに限らずwebサーバーは①と②の間の処理と言えるでしょう。
そして受け取ったリクエストによって、どんな処理をするか決定づける仕組みがRouter(routes)MVCと言えます。
簡単に説明していきたいと思います。

◇概要

Router

Routerは受け取ったHTTPリクエストのURLHTTPメソッド(GetとかPostとかext...)の組み合わせによりControllerのどのアクションを発動させるかを決定します。
どのアクションを起こすかというルール決めはroutes.rbファイルに記述します(参照)。

MVC

Railsではお馴染み(?)のMVCですが、今回はそれぞれの責務について細かくは説明しません。ざっと説明すると、

Model:データを司ります
Controller:ModelとViewの司令塔です。色んなアクションがあります。
View:ブラウザに何が映るかというフロント側を司ります


◇やりとりの流れ

HTTPリクエストを受け取ってからのシーケンス(順序)は以下の流れです。

①ServerがHTTPリクエウトを受け取りRouterに引き渡す

②RouteがURLとHTTPメソッドの組み合わせで送り先Controllerとアクションを判定する

③アクションがModelにデータを取得する指令を出す

④Modelが指令をSQLに翻訳してDBにアクセスする

⑤DBがSQLの指令を実行してModelに結果を返す

⑥Modelの結果をインスタンス変数に格納する

⑦インスタンス変数に格納されたデータを該当するViewに引き渡す

⑧Viewがブラウザに表示する元となるerbファイルからHTMLを生成し、HTTPレスポンスをクライアントに返す

◇具体的に見る

progateやrailsチュートリアルでこんな教え方してたなというのを思い出しつつ、それにそって説明します。
分かりやすいのでusers showを見ることとします。

①ユーザーの個人情報を見たいのでリンクをクリックし、
 url: xxxxxxxxxxxx/users/30 へジャンプ。

②RouterはurlとHTTPメソッドより、users コントローラーのshow アクションを判定。

③④⑤⑥
showアクション内で

def show
  @user = User.find(params[:id])
end

と定義されているはず。このUserがつまりuser.rbのclass Userを表しているのですが、要するにUserモデルです。
Userモデルに 「idが30番のヤツ探してこいや!」と指示しています。この指示にしたがって裏でDBとやりとりをして受けとったデータを@userに格納しています。この@userがインスタンス変数です。

⑦⑧
@userに格納されたデータは viewフォルダのuserフォルダのshow.html.erb 内で展開されます。

<%= @user.name %>
<%= @user.email %>
<%= @user.age %>

みたいなのが記述されていれば、それぞれ「名前、メールアドレス、年齢」が表示されます。

◇まとめ

Railsは原則的にこのシーケンスから外れることはありません。
リンクを踏むにしろ、フォームに記載した情報を送信するにしろ、退会ボタンを押すにしろ、必ず

URLとメソッドよりControllerとアクションを判断 → モデルを通じてDBとやりとり → 受け取ったデータをインスタンス変数に格納し、Viewで展開

というやりとりをします。


=======================================================

◇この記事が役に立ったら

記事の内容としてはこれでおしまいですが、もしもこの記事が役に立たら、ページ下の「気に入ったらサポート」ボタンから投げ銭して頂けると幸いです!
noteの会員でない方でも、下の「記事を購入する」ボタンからこの記事を100円で購入することが可能です!
あなたの投げ銭がモチベーションに繋がるので、よろしくお願いします!


ここから先は

146字

¥ 100

この記事が気に入ったらサポートをしてみませんか?