Railsチュートリアル(第4版)メモ 第3章

Railsチュートリアル(第4版)の個人メモ
気になった部分、忘れそうな部分を記述。

- Ruby 2.6.1
- Rails 5.1.6

2章ではScaffoldを使ってあらましを、
3章から本格的にアプリ制作に入る。
3章では「静的なページの制作」、「自動テストのあらまし」の学習をする

# 3章 ほぼ静的なページの作成
## 3.2 静的ページ
### 3.2.1 静的なページの生成
#### コントローラ生成(rails generate)時にアクションは複数指定できる
```shell
$ rails generate controller StaticPages home help
```
home helpのようにcontroller名のあとに複数指定可能

#### Rubyの命名規則の特徴
クラス名にはキャメルケース（例:StaticPages）が使われる
ファイル名にはスネークケース（例:static_pages）が使われる
※あくまで慣習だが、同様に習うべき

#### Railsコマンドの短縮

|完全なコマンド|短縮形|
|:--|:--|
|`$ rails server`|`$ rails s`|
|`$ rails console`|`$ rails c`|
|`$ rails generate`|`$ rails g`|
|`$ rails test`|`$ rails t`|
|`$ bundle install`|`$ bundle`|

#### Railsでの手戻し
##### コントローラ, モデル

```shell
$ rails destroy controller HogeHoges
```
`generate` に対しての `destroy`

※ destroy時、`/config/routes.rb`内にルーティングが残っているかもしれない。手作業で削除

##### DB

DBも逐一マイグレーションが必要

```shell
$ rails db:migrate
```

だが、1手手戻しもできる

```shell
$ rails db:rollback
```

またdbのマイグレーションは逐一バージョンが付与されているので、最初に戻す場合、以下

```shell
$ rails db:migrate VERSION=0
```

### 3.2.2 静的なページの調整
#### viewsの場所
`app/views/コントローラ名/アクション名.html.erb`
erb (Embedded Ruby)
htmlにrubyを埋め込んである。

## 3.3 テストから始める
テスト駆動開発 （test-driven development; TDD）
RailsチュートリアルではガチガチのTDDでは進みが悪いので、必要に応じてTDD

チュートリアル内で行うテストは3つ

- コントローラテスト (3章〜)
- モデルテスト (6章〜)
- 統合テスト (7章〜)

[結局テストはいつ行えばよいのか](https://railstutorial.jp/chapters/static_pages?version=5.1#aside-when_to_test)

### 3.3.1
#### コントローラテスト
`$ rails generate controller hogehoge` の時点でテストが既に作成されている。
`/test/controllers/`
### 3.3.2
#### テスト駆動のサイクル

1. 失敗するテストを最初に書く
1. アプリケーションのコードを書いて成功させる (パスさせる）
1. 必要ならリファクタリングする

それぞれステータスから

1. RED
1. GREEN
1. REFACTOR

とも。
このサイクルを繰り返す。

以下テストを元に、`$ rails test`を確認しながら、通るようにしていく。
テストを書き、通るように開発。簡単なTDD。

```ruby
require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest

  # 省略

  test "should get about" do
    get static_pages_about_url
    assert_response :success
  end
end
```

#### リファクタリング
「1匹いたら30匹いると思え」
金言。BUGでなくとも腐敗臭漂うだけでリファクタリングもの。
ネズミもGもBUGもスパゲッティコードも。早いうちからのリファクタリングが大事。

## 3.4 少しだけ動的なページ
HTML内でheadのtitleタグを動的に表示し、TDDでつなぐ。

### 3.4.2
リファクタリング。
2,3回出てくる文字列を変数化
(インスタンス変数、文字列の式展開について、触れられている)

### 3.4.3
DRY (Donot Repeat Yourself)
Rubyの原則。
共通部分をRailsの機能でまとめる。
`/app/views/layouts/application.html.erb`
上記に大枠のレイアウトを記述。
その他アクションのerb内の内容は、application.html.erb内に
`<%= yield %>`
と記述し、挿入する。

## 3.5 最後に
コミットとデプロイ
masterブランチに変更をmerge
herokuにデプロイ

```shell
$ git checkout master
$ git merge 作業ブランチ名

# プッシュとデプロイ
$ git push # github側 push
$ rails t # herokuデプロイ前テスト
$ git push heroku # heroku側 push
$ heroku open # 確認
```

デプロイ前に `rails test` を実行。癖をつけるようにする。

## 3.6 高度なセットアップ
### 3.6.1 minitest reporters
minitest-reporters (gem) でRailsのテストを見やすくする。
RED、GREENで色がつくようになる。

### 3.6.2 Guardによるテストの自動化
Guardというgemでファイルを監視、自動テスト

```shell
$ bundle exec guard init # 初期化
$ bundle exec guard # 監視スタート
```

guardのプロンプトが開く。
フルスキャンはそのままEnter。
終了は `<C-d>` でデタッチ。

GuardはSpringサーバ(Railsの機能)を使うが、バグが有りプロセスが残ることが有るので、重いときには余計なものをkillする。

#### Linux killコマンド
プロセスのkill

```shell
$ ps aux | grep spring
```
パイプでgrepに渡し、springのみ抽出
pid(数字5桁)を指定してkill

```shell
$ kill -15 12345 #pidはあくまで例
```
ここのoptionで指定するシグナルは15がterminationで一緒か？
どうやらCPUごとに一部変わるそうで、x86なら`-15`で`SIGTERM`(termination)で終了できるらしい。
我が家のintelmacさんはx86かと思うので`-15`

Springなら
1. 一括終了を最初に試す、
2. ダメなら`pkill`

```shell
$ spring stop
$ pkill -15 -f プロセス名 # ダメなら
```

# 所感
テスト駆動で書きながら、コントローラからビューに至るまでの流れをトレースできたように思う。
簡単なテストだが、まだ苦に思わない程度で済んでいる。
演習で2,3度同じような作業が繰り返されるので、少しずつ馴染めそう。