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

# はじめに
現在、webエンジニアに転職すべく、プログラミングスクールで学習をしております。RubyonRailsでのアプリケーション開発のアウトプットに先駆けて、本書を学習しました。ここでは、その感想をまとめていこうと思います。（全部書くのは時間がかかるので、わかりにくかったところや、覚書としておきたいところをまとめて書いております。）

# RubyonRails速習実践ガイドを読んで
本書は、１０のChapterに分けて解説されていました。それぞれのChapterごとに読んで学んだことと、理解度をまとめていこうと思います。

## Chapter１：RailsのためのRuby入門
このセクションは、本書の前にRuby自体の学習をチェリー本や、アウトプット課題でこなしていたため、知っているものばかりでした。（理解度：５）
- rubyは万物がオブジェクト
- nilとfalseが偽、それ以外が真。
- nilガード：例えば、`number ||= 10`のように書く。これは「もしもnumberがあればnumber、なければnumberに10を代入した上でのnumber」というような意味。nilを避けて、代わりに何らかのデフォルト値を入れておきたい時に使うことができる。
- ぼっち演算子&.:例えば`name = object&.name`のように書く。これは、nameがfalseならnilを返す。つまり、
```
name = if object
    object.name
else
    nil
end
```
と同じである。

## Chapter2：railsアプリケーションを覗い見てよう
ここは、環境構築のために必要なソフトをインストールしたり、scaffoldをジェネレータで作成して、railsの雛形を作成し、実際にアプリケーションの外形を覗いてみる、というセクションでした。（理解度：５）
- `rails new`でrailsプロジェクトを立ち上げた後に、`bundle exec rails　〇〇`とするのは、アプリケーションフォルダの`bin/rails`に指令を出すことと同義なので、`bin/rails 〇〇`のように打ち込んでも問題ない。
- コードの通り道は、まずルーティング。処理に適したアクションを呼び出す。
- 次にコントローラ。アクションが定義されている。
- そして、モデル。データベースと接続して、必要なデータを探す。
- 次にビュー。リクエストにあったビューを生成する。そうして、レスポンスとしてビューを返す。
- 主要ディレクトリ構成。`app`に主要なプログラムが入っている。`bin`には設定ファイル。`db`は、データベースについてのファイル。`lib`は自作ライブラリ。`log`は静的ファイル。中でも`app/config`は、アプリケーションの基本的な設定ファイルが配置されているディレクトリ。
- MVCモデル。
## Chapter3：タスク管理アプリケーションを作ろう
このセクションは、タスク管理アプリケーションを作成するセクションでした。順を追って、細かく説明してくれているので、非常にわかりやすかったです。答えを見ながらなら、自分でもアプリケーションが作成できるのだという自信にもなりました。
- Slimという記法がある。これは、ERBというテンプレートエンジンの記法の１つで、少ない記述量で、簡潔で読みやすいコードとなる。
- railsのエラーメッセージを日本語で出せるようにするためには、`config/initializers/locale.rb`というファイルを作成して、そこに翻訳する文章を書き込んでいく。（rawファイルをダウンロードすればOK）
- 開発手法としては、一番最初に、機能に関連するモデルを作成していくという方法が一般的。
- 各アクションの用い方。
- パーシャルを使用して、メソッドの共通化ができる。DRY原則より。
- シンプルなCRUD機能の作成。
## Chapter4:現実の複雑さに対応する
バリデーションやスコープ、ログイン、ログアウトに必要なセッションなど、現実のアプリケーションに欠かせない機能をつけるために必要な技術を学習するセクション。（理解度：４）
- マイグレーションは、バージョンの記録。上げ下げできる。bin/rails db:migrateや、bin/rails db:rollback
- モデルの検証（有効性の検証）は、valid?メソッド。
- 検証の書き方は、presence,numericality,inclusion,length,format,uniqueness,confirmationがある。
- セッションとCookie。セッションの機能は、cookiesで実現する。
- パスワードを表す属性名は、`password_digest`となっている。has_secure_passwordという機能を使う。
- パスワードをハッシュ化するために、bcyptというgemを用いる。
- has_secure_passwordを用いると、データベースのカラムには存在しない、password属性と、password_confirmation属性が加わる。
- ログイン機能を作成する：セッションというリソースを作成する、と捉える。
- ログアウト機能を作る:session[:user_id]にnilが入っている状態にする。
- アクションの前に呼ばれるフィルタをつけるのは、before_actionメソッド。
- カスタムのクエリー用のメソッドとして使うことができるようにするために、scopeというメソッドを用いる。
- rails７からは、リンクはrinkuというgemをインストールして、autolinkを作成する。
## Chapter5:テストを始めよう
このセクションは、テストの書き方、実行の仕方を学習する。テストをしながら進めることで、適切な粒度のコードになりやすい。テストを書きやすいプロダクトコードを作ることを意識することで、管理しやすい粒度で構成されたコードにしていけるという性質がある。（理解度：３）
- RSpecを用いて、テストを機能ごとに実行しながら進めていく手法が、テスト駆動開発。
- describeには、「何について記述しようとしているのか（テストの対象）
- contextには、テストの内容を状況／状態のバリエーションごとに分類するために利用する。
- beforeは、対応するdescribeやcontextの領域内のテストコードを実行する前にbeforeのブロック内に書かれたコードを実行してくれる。
- itは、期待する動作を文章と、ブロック内のコードで記述する。（末端のテストケース）
## Chapter6:Railsの全体像を理解する
ルーティング、RESTful、国際化、日時の扱い方、意図しないパラメータを弾くStrongParameters、CSRF対策、アセットパイプラインを学習する。（理解度：２）
- ルーティングは、アクセスを受けて適切なアクションへと案内する仕組み。
- `resouces :tasks`のように、一括して機能群のルートを作成できる機能がある。
- これにより、/tasks→たsks→tasks_pathのように、URLパターンとURLパターン名、ヘルパーメソッドが決定され、これにHTTPメソッドが組み合わさることで、アクションが指定できる。
- Rubyコードインジェクションのために、ユーザーからの入力をそのままsendに渡すことは避ける。
- アセットパイプラインは、JabascriptやCSSを最終的にアプリを使う上で都合の良い状態（ブラウザが読み取れる形式で、時効速度が速く、ブラウザキャッシュに対して最適化される）にするために行う処理。
- マニフェストファイルを記述して、アセットパイプラインを作る。
- あらかじめアセットパイプラインを実行して静的ファイルを生成するという処理を、プリコンパイルと呼ぶ。
## Chapter7:機能を追加してみよう
登録や編集の実行前に確認画面を挟んだり、一覧画面に検索機能やソート機能を追加したり、メールを送ったりといった、諸機能を追加するためのセクション。（理解度：３）
- 確認画面は、resoucesの中に含まれていないため、ルーティングで別に定義して行う必要がある。
- 一覧画面への検索機能の追加には、ransackというgemを使用する。
- 一覧画面へのソート機能も、ransackが機能する。ソートについてのヘルパーメソッドが用意されている。
- メールを送るには、メイラーを利用する。
- 画像をアップロードし、利用するには、ActiveStorageを利用する。
- ページを複数枚ごとにまとめる処理は、ページネーションという。kaminariというgemで行う。
- railsサーバとは別のサーバを立てて、バックグラウンドでジョブを実行することを、非同期処理という。Sidekiqというツールで、行うことができる。
## Chapter８：RailsとJavascript
画面遷移なしで行いたい処理にすいて、Javascriptを組み合わせることで、実現することができる。Javascriptで基本的なGUIの実現を行い、データの永続化やそれに伴うビジネスロジックの処理をサーバサイドで行う。このサーバサイドの実現するために、Railsを用いる。Railアプリケーションは、APIを提供するためだけにとどまる。（正直この辺は、概念的な理解はできたが、扱い方としては全然わかりませんでした。理解度：２）
- Ajaxは、Webブラウザ上で非同期通信を行い、ページの再読み込みなしに、ページの更新をするためのJavascriptのプログラミング手法。ページの一部だけをサーbから取得し、更新することが可能になる。
- ページ遷移ではなく、Ajaxリクエストを作成する。例えば、削除したタスクを非表示にすることができる。
- Turbolinksは、ページ遷移を高速化するJavaScriptメソッド。全てのリンククリックに対するページ遷移を自動的にAjax化することで高速化を図る。
- 一度訪れたことのあるページを再度訪問した際、前回のキャッシュを一旦表示してからリクエストを送信し、取得が完了してから新しいものに置き換えるプレビュー機能がある。
## Chapter9:複数人でRailsアプリケーションを開発する。
チーム開発の風景を会話形式で追って、必要なツールや流れなどを詳しく説明しているセクション。（理解度：４）
- Githubを用いる。
- プルリクエストで変更を共有し、レビューをもらう。
- Gitのブランチの変え方。
- 変更差分を最新との比較にする。そのために、rebaseする。または、レビュー前にマージする。
- push の-fに気をつける。
- レビューでは、コントローラ層、モデル層などの、レイヤにわけてレビューを行う。
- チームで開発するときの分担の仕組み
- redoを習慣化する。redoは、マイグレーションを書いたときに、確実にロールバックが成功すること（自分の書いたマイグレーションがバージョンを下げる際にトラブルを起こさないことを確認できる。
- ↑は、バーノンを下げた後にもう一度上げてくれる。
- 直接DBを変更したら、必ずマイグレーションファイルも追加しておく。
## Chapter10:Railsアプリケーションと長く付き合うとために
主に、バージョンアップの仕方を知る。
- bundle updateコマンドを用いてgemの小さなアップデートを継続して続けていくことが必要。
- bundle updateはチーム全体で行う。バージョンアップ当番を決めておく。
- 大きなバージョンアップもある。例えば、railsのメジャー／マイナーバージョンアップ。
- Rubyのバージョンアップ。
- その他大きめのgem。
- アプリケーションの複雑さに立ち向かうために、第一の鍵：適切な場所にコードを置く。第二の鍵：上手に共通化する。第三の鍵：新しい構造を追加して役割を分担する。　の観点で、日頃からコードの状態を観察し、必要な改善を続けていくことが重要。
- 例えば、本来モデルに書くべきコートどモデルに寄せたり、ビューに入り込んだビジネスロジックをモデルに寄せたりすること。
- コードの重複に気が付いたならば、早めに共通化を行なっていく必要がある。（難しい作業。）

# 終わりに
これまでの課題と比べて、一気に難しくなったなと感じました。めげずに、頑張りたいと思います。