Ruby on Rails5 速習実践ガイドを読んで

# はじめに
今回はrailsインプット学習の一環として
[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)を読了しましたので、その感想・学んだことを記述していこうと思います。

* これから読もうと検討しているが、その前に一通り本書の概要を知りたい方
* 読了したが改めて本書の要点を整理したい方

といった方々にお役に立てれば幸いです。


# よかったところ
### 簡単なアプリを作りながらrailsの基礎を学べる
表題にあるように、本書では簡単なTodoアプリとタスク管理アプリを作成しながらrailsを学ぶことができます。
2つ目のタスク管理アプリに関しては多様な機能を搭載するので、railsを網羅的にインプットすることができます。
実際に手を動かしながら、railsのアプリを作成することで、**全体像を把握しながら理解を深める**ことができるので、今後本格的なアプリ開発をする上での足がかりになる経験を積むことができました。

### railsの基礎的概念が掘り下げて解説されている
本書では、特段難易度の高い実装課題はありませんが、その分基礎概念が深く掘り下げて解説されています。
例えば「MVC」や「ルーティング」、「マイグレーション」などの概念に関して、railsを少し勉強したことがある方であれば、どのような概念なのかある程度は理解することができていると思われますが、
1-10まで完璧に理解し・説明できるかというと、私含め自信を持てる人は多くないと考えられます。
本書ではそういった　**「なんとなく理解してるけど、完璧かどうか問われると怪しい基礎概念」** がページ数を割いて解説されています。
ネットでは、幅広い情報に簡単にアクセスすることができますが、
こういった **基礎概念を「体系的に、深く」理解** することに役立てられるのは技術書ならではですね。
といったも、私もまだ読んだだけで、完全に理解することができていないので、
今後学習を進めていく上で都度本書に立ち返りながら少しずつ理解を深めていければと考えております。

# 学んだこと

### MVC
#### MVCとは
アプリケーションを作成する際に、役割ごと(M:モデル、V:ビュー、C:コントローラー)にファイル、コードを整理・管理するための考え方のこと。
上記のMVCを開発に取り入れることで保守性、可動性の高いコードをコーディングすることが可能になる。

参照)https://pikawaka.com/rails/mvc
![0055.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/aa8d939a-f22a-afd4-9bf1-4fa152615d45.png)

#### MVCの各役割
* **Model(モデル)の役割:データベースを管理すること**
→　コントローラーの指示に従い、データを取得、削除、更新などを行う。
→　データの検証(バリデーション)やテーブルとの関連付けなど細かい処理などを行う。


* **View(ビュー)の役割:ブラウザに表示する画面を出力すること**
→　静的ページだけでなく、コントローラーから受け取ったDB情報を反映させたページを表示させることも可能。
→ フォームなどで、ユーザーに名前やコメントなど必要な情報を入力させてコントローラに渡し、データベースに送信することもできる。

* **Controller(コントローラ)の役割:ViewとModelを繋ぐこと**
→データ表示はViewに、ロジックの実行はModelに切り分け、その２つをコントロールするのがControllerの役割。




### ルーティング

#### ルーティングとは
送信されたリクエストに対して、どのコントローラのアクションを動かすのかを設定する場所のこと。
つまり　**リクエストをアクションへと道案内する「ルート」**　とも言い換えることができる。
railsでは``config/routes.rb``に記述する。


#### ルートを構成する要素

```rb
# "tasks#index"は、"コントローラー名#アクション名"のこと

get "tasks" => "tasks#index"
```

* **HTTPメソッド**
 
| 要素内容の例 | 説明 |
|:-:|:-:|
| GET,POST,PUT,DELETE,PACHT  | サーバーへのリクエストの際に指定するもので、情報の送信・取得の方法を表す。  |

* **コントローラ**
 
| 要素内容の例 | 説明 |
|:-:|:-:|
| tasks(TasksController)  | 呼び出したいアクションのコントローラクラスを指定する  |

* **アクション**

| 要素内容の例 | 説明 |
|:-:|:-:|
| index  | コントーラ内で呼び出したいアクション(メソッド)を指定する  |

* **URLパターン**

| 要素内容の例 | 説明 |
|:-:|:-:|
| /tasks,/tasks/:id  | URLそのものや、:idのように一部に任意の文字が入るようなパターンを指定する  |

* **URLパターンの名前**

| 要素内容の例 | 説明 |
|:-:|:-:|
| new_task,tasks  | 定義したURLパターンごとに一意な名前をつける|

### マイグレーション

#### マイグレーションとは
migrationは元来「移住、移動」を意味し、

https://eow.alc.co.jp/search?q=migration

railsにおいて、このマイグレーションとは
テーブルを**新規作成**したりカラムやインデックスの追加といった**変更**を効率的に行うことができる機能のことを言う。

#### railsにおけるマイグレーションのメリット
* **使用するDBに依存せず、テーブルに行う操作を記述できる**
→　生成されたスクリプトファイルにRailsで決められた文法で記述するが、使用しているデータベースが``MySQL``であっても``Postgres``であっても同じ記述が対応可能
→ 本来であればDBを操作するにはSQL文を記述する必要があるが、railsの場合はより簡潔な記述で代用することが可能


* **更新前の状態にテーブルを戻すことができる**
→　マイグレーションは、１つのファイルが**１つのバージョン**として扱われる。
→ 1つのマイグレーションを記述することで、データベーススキーマのバージョンを上げることができる
→ 適用済みのマイグレーションを1つ取り消すことで、バージョンを1つ下げることができる。






# むずかしかったところ

### JavaScriptとの連動
本書の後半ではrailsとJava Scriptの連動に関して解説がされています。
私個人的な話ですが、Java ScriptをProgateで少し触った程度の学習しかできていないため、
この章に関しては、理解が難しく感じ、同時にJSの学習も進めていかなければと危機感を感じました。
近年JSのフレームワークを用いた開発が主流になってきているので、この分野から逃げることはできません。
JSの学習を進めていく中で都度立ち返る形で理解を深められたらと考えております。


### コードのリファクタリング
本書の最後では、可読性、保守性の高いコーディングについて解説がなされています。
ただ、現時点の私の実力だと、**動くものを作るので精一杯**の状態なので、
この章を理解、実践するのはもう一歩先の段階だと感じました。
ただ、実務においては「動けばいい」ということは許容されず、保守性・可読性の高いコードを書くことが求められるので
この章を理解・実践できるレベルまでスキルを高めていく必要があると思いました。

# 参考

https://pikawaka.com/rails/mvc

https://www.javadrive.jp/rails/model/index5.html