【自分用】railsチュートリアル 3章

やること
静的なページの作成

3.1 セットアップ
リスト3.1 サンプルアプリケーション生成
$ cd ~/environment
$ rails _7.0.4_ new sample_app --skip-bundle
$ cd sample_app/
--skip-bundleはRailsでjavascriptを利用するのに必要なパッケージのインストールをスキップしている。8.2.4で手動でインストールする。

リスト3.2 Gemfile編集

$ bundle _2.3.14_ config set --local without 'production'
$ bundle _2.3.14_ install

bundle installでgemインストール
production環境でしか使わないgemはインストールしないようにする。そうするとPostgreSQL用のpg gemをdevelopment環境にインストールせずSQliteが使われるように
development環境とproduction環境は同じに保つのが理想的

Gemfileで指定されているのと異なるバージョンのgemをインストールしていた場合はbundle updateを実行して、gemのバージョンを合わせておく。

gitリポジトリ初期化
$ git init (リポジトリを新規作成する、または既存のリポジトリを初期化する)
$ git add -A (ファイルをインデックスに追加する（コミットの対象にする） -Aで変更があったすべてのファイルがaddされる)
$ git commit -m "Initialize repository" (インデックスにあるファイルを更新する。-m "~"その場でメッセージを付けてコミット)

本番環境用のDB用意
Renderでは90日間無料で使えるPostgreSQLが提供されているので、サンプルアプリケーション用に作成

Name(ダッシュボードに表示される名前、後から変更可能)と、Database(後から名前変更不可)を設定
作成されたDBのConnectionsにある[Internal Database]は、後ほどWeb Serviceを作成する際に必要

Web serviceを作成していく
アプリケーション名を設定
環境変数にRAILS_MASTER_KEYを設定
入力欄を追加して、keyにはDATABASE_URL、Valueに先ほど作成したDBの［Internal Database URL］を設定

Renderのデフォルト設定ではオートデプロイ機能(Githubにプッシュすると自動でデプロイを行う)がONになっているのでOFFにしておく

Create Web Serviceをクリックで最初のデプロイが行われる
Renderにデプロイするときにエラーが発生した場合は、ダッシュボードの「Logs」から本番環境のログを取得する

3.2 静的ページ
まずrailsのアクションやビューを使って静的なHTMLのみのページを作成、その後動的なページに作り変えていく

railsのアクションはコントローラの中に置く
アクションは目的に沿って互いに関連した操作(作成や削除)を行う
コントローラとは(基本的に動的な)Webページの集合を束ねるコンテナのこと

今いるブランチを確認する
$ git branch --contains
こまめにコミットする

3.2.1 静的なページの生成
generateスクリプトでコントローラを作る
コントローラ名にはキャメルケースを使用する(単語の頭文字を大三字にして繋ぎ合わせた名前　例:StaticPages)
リスト3.7 アクションも同時に作成

コラム3.1 元に戻す方法
 コントローラ生成　$ rails generate controller StaticPages home help
 コントローラ削除$ rails destroy  controller StaticPages home help

 モデル生成$ rails generate model User name:string email:string
　　モデル削除$ rails destroy model User

マイグレーション変更$ rails db:migrate
一つ前に戻す$ rails db:rollback
最初の状態に戻す$ rails db:migrate VERSION=0

リスト3.8 routes内にルーティングが追加されている
/static_pages/homeというURLに対するリクエストを、StaticPagesコントローラのhomeアクションと結びつけている
今回はGETリクエストを受け取った場合にこのアクションが実行される

コラム3.2
HTTPには４つの基本的な操作がある
GET Web上のデータを読み取るときに使われる ページを取得する(get a page)
POST　フォームに入力した値をブラウザから送信するときに使われる
PATCH サーバー上の何かを更新するときに使われる
DELETE サーバー上の何かを削除するときに使われる

リスト3.9 StaticPagesコントローラ
RESTアクションには対応していない
defで定義されたアクションは最初は空なので、URLにアクセスしても単に対応するビューが表示されるだけ
リスト3.10 3.11 ビュー

3.2.2 静的なページの調整
Railsのビューの中には静的なHTMLがある
→Railsの知識がなくてもHomeページやHelpページを修正できる
リスト3.12 3.13 ページ修正

3.3 テストから始める
何らかの変更を行う際には、「自動化テスト」を作成して、機能が正しく実装されたことを確認する
テストのメリット
・いざというときのセーフティネットになる
・アプリケーションのソースコードの実行可能なドキュメントにもなる
・コードを余分に書くことになるが、バグを追うための時間が省略できるので、むしろテストがないときよりも開発速度がアップする
TDD テスト駆動開発：　テストの手法の１つ。最初に「正しいコードがないと失敗するテスト」を書き、次に正しいコードを書いてそのテストがパスするようにする

コラム3.3 テストはいつ行えばいいのか
テストを行う目的
・回帰バグ（以前のバグが再発したり、機能の追加/変更に副作用が生じたりすること）の防止
・コードを安全にリファクタリング（機能はそのままにコードを改善）する
・テストコードはアプリケーションコードから見ればクライアントとして動作するので、アプリケーションの設計やシステムの他の部分とのインターフェイスを決めるときにも役立つ

テスト駆動にするか一括テストにするかの目安
・アプリケーションのコードよりも明らかにテストコードの方が簡単に書けるなら　先に　書く
・動作の仕様がまだ固まりきっていない場合、アプリケーションのコードを先に書き、期待する動作を　後で　書く
・セキュリティが重要な課題またはセキュリティ周りのエラーが発生した場合、テストを　先に　書く
・バグを見つけたら、そのバグを再現するテストを　先に　書き、回帰バグを防ぐ体制を整えてから修正する
・すぐにまた変更しそうなコード（HTMLの細部など）に対するテストは　後で　書く
・リファクタリングするときは　先に　テストを書く。エラーを起こしそうなコードや止まってしまいそうなコードを集中的にテストする

本書ではコントローラテスト、モデルテスト、統合テストの３つを行う
統合テストはユーザーがWebブラウザでアプリケーションとやりとりする操作をシュミレートできる

3.3.1 最初のテスト
Aboutページを作成する
リスト3.14 デフォルトのテスト
リスト3.15 テスト前にdbマイグレートを行う
リスト3.16 生成されたDBはgitに登録しない

3.3.2 Red
テスト駆動のサイクル
1 失敗するテストを書く
2 アプリケーションのコードを書いて成功させる
3 必要ならリファクタリングする

リスト3.17 失敗するaboutページのテスト

3.3.3 Green
リスト3.19
エラーメッセージを見ると、AboutページへのURLがないと書いてある

リスト3.20 about用のルーティング追加

リスト3.21
エラーメッセージを見ると、StaticPagesコントローラにaboutアクションがないと書いてある

リスト3.22 StaticPagesコントローラにaboutアクション追加

テンプレート（ビュー）がまだない
about.html.erbを作成する
$ touch app/views/static_pages/about.html.erb

リスト3.23 aboutページのコード
リスト3.24 テスト成功

3.3.4 Refactor
開発に繰り返すうちに、コードの量が増えていったり記法の統一が崩れて読みづらくなるなど腐敗臭がしてくる
こまめにリファクタリングして綺麗に保つ

3.4 少しだけ動的なページ
静的なページを少しだけ動的にする
ページの内容に応じて、タイトルを自ら書き換えて表示するように

Homeページ、helpページ、aboutページをそれぞれ編集してページごとに異なるタイトルを表示する

3.4.1 タイトルをテストする(red)
リスト3.25 典型的なHTML構造

リスト3.26 タイトルのテスト
assert_select でタグ内に指定した文字列があるか確認する

3.4.2 タイトルを追加する(green)
リスト3.28 3.29 3.30 HTML構造を備えたビュー

3.4.3 レイアウトとERB(Refactor)
重複しているコードの改善
ERB(埋め込みRuby)を使う

リスト3.33 3.35 3.36 ERbを使ったビュー
<% %>は中のコードを実行するだけ
<%= %>は中のコードを実行し、表示する
provideメソッドでパラメータを引き渡し、yieldメソッド部分に挿入する

リスト3.37 レイアウトファイル
bodyタグ内のyield部分に各ページの内容が挿入される
<%= csrf_meta_tags %>: クロスサイトリクエストフォージェリー（Cross-Site Request Forgery: CSRF）攻撃を緩和する
<%= csp_meta_tag %>　: クロスサイトスクリプティング攻撃を緩和するコンテンツセキュリティポリシー（Content Security Policy: CSP）を実装する
<%= stylesheet_link_tag ... %>: スタイルシートとJavaScriptをページ内にインクルードする（=含める）

リスト3.38 3.39 3.40 レイアウトファイルとの重複部分削除

演習
Contactページ作成
1 テスト作成(コントローラ)
2 ルーティング追加
3 コントローラにアクション追加
4 ビュー作成

3.4.4 ルーティングの設定
リスト3.43 ルート(/)にgetリクエストを送るとhomeアクションにルーティングされる(ホームページにアクセスされる)

3.5 最後に
gitにデプロイ

3.5.1 本章のまとめ
・必要なgemのインストール、リモートリポジトリへのプッシュ、production環境の設定
・コントローラ作成時のコマンド: rails generate controller ControllerName アクション名（省略可）。
・新しいルーティングはconfig/routes.rbファイルで定義
・railsのビューでは、静的HTMLの他にERB（埋め込みRuby:Embedded Ruby）が使える
・常に自動化テストを使って新機能開発を進めることで、自信を持ってリファクタリングでき、回帰バグもキャッチできる
・テスト駆動開発ではred green refactor サイクルを繰り返す
・railsのレイアウトは、アプリケーションのページの共通部分をテンプレートに置くことでコードの重複を解決できる

3.6 高度なセットアップ
mainブランチに移動しておく
$ git switch main

3.6.1 minitest reporters
リスト3.46 テスト結果を見やすくする