現場で使える ruby on rails 5速習実践ガイド を読んでみて

# はじめに
現場で使える Ruby on Rails 5速習実践ガイドを読んでみて感じたこと、調べてみたことにまとめました
# 良かったところ
* Railsでかかれているアプリケーションの構築方法だけでなく、どうやって動いているかまで詳しく説明されていて良かった
* テストの重要性やチーム開発の流れについて書かれており、実際に実務をイメージすることができる内容でした
* コードのリファクタリングや共通化に関してもわかりやすく書かれていた
# 学んだこと
### rails7 でのセットアップ
本書はrails5での書き方をされているため、現在(2024/05)使われているrails7での書き方に直す必要がありました
今回は、Dockerでの構築でのセットアップを紹介しようと思います
本書で学ぶ際にセットアップで悩んでいる方がいらっしゃれば、
参考にしていただけると幸いです

dockerでの構築で参考にさせていただいたのは、
Udemyで講座を配信しておられる
かめれおん さんの`米国AI開発者がゼロから教えるDocker講座`です

https://www.udemy.com/course/aidocker/

まず、rails_bookというフォルダを作り
下記の4つのファイルを作成しました。

* Dockerfile
```Dockerfile:Dockerfile
FROM ruby:3.2.2
RUN apt update
RUN apt install -y \
    build-essential \
    libpq-dev \
    nodejs \
    postgresql-client \
    yarn

WORKDIR /rails_book
COPY Gemfile Gemfile.lock /rails_book/
RUN bundle install
```
* Gemfile
```ruby:Gemfile
source "https://rubygems.org"
gem "rails", "~> 7.0.8"
```
* Gemfile.lock
こちらは空でOK
というのもGemfile.lockというのはGemfileを使ってbundle installでRailsのパッケージをインストールすると、今度実際にインストールされたGemのバージョンとその情報っていうのが、Gemfile.lockに入っていくためです
* docker-compose.yml
```yaml:docker-compose.yml
version: '3'

volumes:
  db-data:


services:
  web:
    build: .
    volumes:
      - '.:/rails_book'
    environment:
      - 'DATABASE_PASSWORD=postgres'
    ports:
      - 3000:3000
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db

  db:
    image: postgres
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
```

4つのファイルをrails_book内で作ったら
~~~
docker compose up
~~~
でビルドします。
docker compose up は、今回で言うとRails上に作ったDockerfileがビルドされてイメージができて、さらにこれらのパラメーターを元にRUNされると、コンテナが作られる
~~~
docker-compose exec #{container} bash 
~~~
#{container}の部分にはコンテナ名を入れてください
起動しているコンテナに対してコマンド実行を行うには、この操作が必要になります。
そして、postgresql環境に合わせて、
config/database.ymlを編集します
にコンテナ内で
~~~
rails db:create
~~~
を行い、その後
~~~
rails server
~~~
でアプリケーションを起動し、localhost:3000で確認してください


### chapter2
* ユーザーを管理するために必要な機能 CRUD
    * 作成（Create）
    * 読み出し（Read）
    * 更新（Update）
    * 削除（Delete）
* MVC（モデル・ビュー・コントローラー）
UIを持つソフトウェアのアーキテクチャの1種。ソフトウェアをどのような構造にするかについての考え方のパターンの一つ。
UIに関わる部分（ビュー）、アプリケーション固有のデータや処理の扱いの部分（モデル）、モデルやビューを統合的に制御する部分（コントローラー）の3つに分けて管理しやすくしようとするのが目的。

### chapter3
* `simple_format`メソッドはテキストに含まれる一部の危険なHTMLタグを取り除いてくれる
* renderメソッドのパーシャルオプション
    * インスタンス変数を使用せず、ローカル変数として渡すようにする
* rails7 では method DELETE が効かないので、link_to の method:オプションの書き方を変える必要がある

https://qiita.com/jnchito/items/5c41a7031404c313da1f#link_to%E3%81%AEmethod%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%8C%E5%A4%89%E3%82%8F%E3%81%A3%E3%81%9F

### chapter4
* マイグレーションにおいては一つのマイグレーション（ファイル）が1つのバージョンとして扱われる
* Railsではすでに作ってあるテーブルのカラムに後から制約をつける際にもマイグレーションを利用する
* `save`メソッドはデータベースの登録・更新を行う前に自動的に検証する。検証エラー時にfalseを返す
* `save!`メソッドは検証エラー時に 例外を発生させる
##### ログイン機能
* セッション:アプリケーションサーバ側で独自に表現される仕組み
* Cookie:ブラウザとWebサーバの間でやりとりされる汎用的な仕組み
* Railsのセッションの仕組みの一部がCookieによって実現される
    * CookieによってやりとりされるセッションIDをキーにして保管される
    * そのためブラウザ側で対応するCookieデータを消せば、セッションはリセットされる
* has_secure_password:パスワードのハッシュ化（bcryptというgemが必要）だけでなく認証のための機能も追加してくれる
* `User.find_by(id: session[:user_id])`
    * ログインしているユーザーを取得する処理は、コントローラやビューから簡単に呼び出せるようにするのが基本
    * ApplicationControllerにcurrent_userというようなメソッド（コントローラでは、アクションではないユーティリティメソッドは基本的にprivateメソッド）を定義することで全てのコントローラから使えるようにする
    * helper_methodを指定することで、すべてのビューからも使えるようにする
* 関連（Association）:データベース上の紐付けを前提にして、モデルクラス同士の紐付けを定義することができる

### chapter5（テストをはじめよう）
##### テストを書くことのメリットとは
* 環境のバージョンアップやリファクタリングの必須条件
* 仕様変更の影響の大きさ
* 仕様を記述したドキュメントとしても機能する
    * RSpec：動く仕様書としての面に特にフォーカスして作られたテスト用ライブラリ
* RSpecを使用する上では、従来的な「テスト」ではなく「Spec」を書くのだと言う気持ちが大切
* 特に重要だと考えられるテストは、テストの粒度として一番外側に位置しているシステムテスト
    * システムテスト：E2Eテストに相当し、ブラウザを通してアプリケーションの挙動を外部的に確認できる

### chapter6（Railsの全体像を理解する）
##### ルーティング
* RESTfulなインターフェースを作りやすいように作られているのが特徴
* ただし、ブラウザで利用するアプリケーションの場合は、CRUD以外の独自アクションの追加やリソース階層が深くなっていく場合は、RESTfulを厳密に守る必要はない
* CRUDのルート一式を`resources`というメソッドで定義することができる
* `routes.rb`の構造化することが可能
    * scope：ブロック内の定義にまとめて一定の制約をかける
    * namespace：URL階層、モジュール、URLパターンに**一括**で一定の制約をかける
    * controller:コントローラを指定する
* 詳しくはRailsガイドを参照していただくと良い

https://railsguides.jp/routing.html

##### Strong Paramaters
* コントローラでリクエストパラメータを受け取る際に、想定通りのパラメータかどうかをホワイトリスト方式でチェックする機能
* フォーム画面に更新したい属性のフィールドを追加したのに、permitする属性を増やすのを忘れた場合には、画面上はエラーが出ないため注意する

### chapter10
* `bundle update`小さなバージョンアップが欠かせない
    * なるべくこまめに継続的に
    * チーム全体で行うこと
* アプリケーションの複雑性に立ち向かう
    * 1：適切な場所にコードを書く
    * 2：上手に共通化する
    * 3：新しい構造を追加して役割を分担する

# 終わりに
* Railsのバージョンが5の内容であるため、最新のバージョンで学習する際には注意が必要です（railsガイドと併用すると対応可能な部分もある）
* 実際に手を動かしてみないと理解が深まらないと思うので、都度確認をしに本書に戻ってこようと思います