Ruby on Rails一連の流れ
全体の流れ
1.ブラウザからのリクエスト→ルーター
2. ルーター→コントローラー
3. コントローラー→モデル
4. モデル→DB
5. コントローラー→ビュー
1.ブラウザからのリクエスト→ルーター
ユーザーがブラウザからサーバーにリクエストを送る。リクエストにはURL(https://~)やHTTPメソッド(GET, POST, DELETEなど)やその他パラメーターなどが含まれている。
ブラウザ(UI: User Interface)からURLを元に行きついたサーバーでは、まずルーターがそのリクエストを受け取る。ルーター(routes.rb)はこれからの一連の処理の案内役である。
2. ルーター→コントローラー
ルーターは受け取ったリクエストから指定されたコントローラーの指定されたメソッドを実行する。
例:以降、「Blog.show」メソッドを例にして示す。
「/blogs/~」というURLがくれば「BlogsControlloer」というコントローラークラスへ渡す。(これはフレームワークであるrailsの規則。何も設定しなければ、URLに応じて、命名規則で決められたコントローラーへ渡す。)
app/controller/blogs_controller.rb
そして、「/blogs/:(id)」のようなURLと、同じくリクエストに含まれているHTTPメソッドがGETであれば、そのクラスのshowメソッドを実行する。
3. コントローラー→モデル
そのメソッドは、大体の場合、DB(データベース:PostgreSQL, MySQLなど)のデータを取得したり、修正したりするもので、どういう処理をしたいかをモデルに伝える。
例:
showメソッドが実行されるとまずBlog.find()が行われる。
app/controllers/blogs_controller.rb
これはモデルには「Blog」というクラスがあり、そのfind()メソッドを行うという意味である。
app/models/blog.rb
4. モデル→DB
モデルはDBと一対になっていて、「Blog」というモデルクラスがあれば「blogs」というテーブルがDBに存在する。
※モデルの中(モデルファイル名:blog.rb)にはfind()メソッドは記述されてはいないが、find()やnew,saveなどはテーブル操作において使えるActiveRecordのメソッドである。なので、Blog.find()はクラスBlogのインスタンスメソッドのfind()を実行してほしいと伝えている。
app/models/blog.rb
例えるなら、モデルはDBという異国へ行く。DBは異国なので使われている言語が違う。なのでモデルはメソッドからの命令を翻訳して理解して、他言語が使われているDBでデータを探しデータを調達したり、改修したりする通訳者兼配達者みたいなもの。
例:
これをActiveRecordで解釈したモデルは下記のようにSQLへ翻訳する。
モデルクラス「Blog」→DBのテーブル名「blogs」
インスタンスメソッド「Blog.find(2)」→SQLのメソッド「select * from blogs where id=2」 :id値が2のレコードを取得する。
console
上図から翻訳されているのがわかる。こうして取得したレコードをコントローラーへ渡す。
5. コントローラー→ビュー
コントローラーはモデルから受け取ったレコードをインスタンス変数に格納して、ビューへ渡す。
例:
コントローラーのshowメソッドでは、モデルからDBから取ってきたレコードを@blogというインスタンス変数へ代入する。そしてそれをビュー(show.html.erb)へ渡してビューで表示できるようにする。(これはrailsの命名規則であり何も設定しなければ、実行したメソッドの名前に応じて、決められたコントローラーへ渡す。def show→show.html.erb。表示先を変えたければredirec_toやrenderで指示する。)