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

やること
大量の機能を自動的に生成するscaffoldジェネレータというスクリプトを使ってtoyアプリケーション作成

2.1 アプリケーションの計画
rails newでrailsのバージョンを指定しながらアプリの骨組みを生成
$ cd ~/environment
$ rails _7.0.4_ new toy_app --skip-bundle
$ cd toy_app/

リスト2.1 bundlerで扱うgemfileを編集

bundle config set --local without 'production'オプションで本番用のgemを除いたローカルgemをインストールできる
$ bundle _2.3.14_ config set --local without 'production'
$ bundle _2.3.14_ install
うまく動かなかったらbundle update
The dependency tzinfo-dataの警告メッセは無視して問題ない

リスト2.2 applicationコントローラにhelloアクション追加
リスト2.3 ルートルーティングを設定
リスト2.4 ローカルのwebサーバーに接続できるように

gitのバージョン管理下に置く
$ git init
$ git add -A
$ git commit -m "Add hello"

github上に新しいリポジトリ作成し、生成したファイルをプッシュする
$ git remote add origin https://github.com/<あなたのGitHubアカウント名>/toy_app.git
$ git push -u origin main

2.1.1 ユーザーのモデル設計
アプリケーションの構造を表すデータモデルを最初に設計しておく
toy_appではユーザーと短いマイクロポストのみを扱うので、UserモデルとMicropostモデルについて考えていく

図2.2 各ユーザーには、重複のない一意のキーとなるinteger型のID番号（idと呼ぶ）、一般公開されるstring型の名前（name）、string型のメールアドレスを持たせる。メールアドレスはユーザー名としても扱われる
ユーザーはテーブル、id、name、emailはテーブルのカラム（column:列）と呼ぶ

2.1.2 マイクロポストのモデル設計
マイクロポストとは短い投稿のこと
図2.3 idとtext型のcontentで構成される
しかし、ユーザーと関連付ける(associate)必要があるので投稿者を記録するためのuser_idも追加する

2.2 Usersリソース
ユーザー用のデータモデルを、そのモデルを表示させるためのwebインターフェイスに従って実装する
これらは組み合わさってUsersリソースとなり、ユーザーをHTTPプロトコル経由で自由に作成、取得、更新、削除できるオブジェクトとみなすことができるようになる

$ rails generate scaffold User name:string email:string
scaffoldコマンドの引数にはリソース名を単数形にしたもの(今回はUser)を使い、データモデルの属性をオプションとしてパラメータに追加する
name:stringとemail:stringオプションを追加
idはrailsによって自動的に主キーとしてDBに追加される

リスト2.5 rails db:migrateでDBをマイグレートする
DBを更新してusersデータテーブルを作成する

2.2.1 ユーザーページを探検する
表2.1 Usersリソースをscaffoldで生成したことでユーザー関連ページが多数追加されている
/users	index	すべてのユーザーを一覧するページ
/users/1	show	id=1のユーザーを表示するページ
/users/new	new	新規ユーザーを作成するページ
/users/1/edit	edit	id=1のユーザーを編集するページ

2.2.2 MVCの挙動
Usersリソースの挙動をMVC(モデル・ビュー・コントローラ)パターンから見てみる

/usersにあるindexページをブラウザで開くときの内部の挙動
1. ブラウザから/usersというURLのリクエストをRailsサーバーに送信する(アドレスバーにURLを入力したり、リンクをクリックしたときに発生)

2. /usersリクエストは、railsのルーティング機構（ルーター）に到達し、URLに基づいて適切なコントローラ(今回はUsersコントローラ)内のindexアクションに割り当てられる

3. indexアクションが実行され、Userモデルに全てのユーザーを取り出せ(User.all)と問い合わせる

4. Userモデルは問い合わせを受け、全てのユーザーをDBから取り出す

5. DBから取り出したユーザーの一覧をUserモデルからコントローラに返す

6. Usersコントローラはユーザーの一覧を＠users変数（＠はRubyのインスタンス変数）に保存しindexビューに渡す

7. indexビューが起動しERB（Embedded Ruby:ビューのHTMLに埋め込まれているRubyコード）を実行してHTMLを生成する

8. コントローラは、ビューで生成されたHTMLを受け取り、ブラウザに返す

リスト2.6 ユーザーからリクエストされたURLを、Usersリソースで使うコントローラのアクションに割り当てるためのコード
config/routes.rbで、URLとアクションの組み合わせを設定していく

リスト2.7 ルートからusersへのルーティング
/にアクセスするとUsersコントローラのindexアクションが実行されるようになる

リスト2.8 Usersコントローラ内のアクションの骨格

表2.2 アクションとURLとHTTPリクエストメソッド

リスト2.9 Userモデルから全てのユーザー一覧を取り出し@users変数に保存する

リスト2.10 Userモデル
継承により多くの機能が備わっている

リスト2.11 usersのindexアクションに対応しているビュー
Railsのコントローラ内で宣言したインスタンス変数はビューでも使えるようになる

2.2.3 Usersリソースの欠点
・データの検証が行われていない
  このままではユーザー名が空欄でも、出鱈目なメールアドレスでも登録されてしまう
・ユーザー認証が行われていない
  ログイン、ログアウトが行われていないので誰でも操作できてしまう
・テストが書かれていない
  データ検証やユーザー認証など必要な要求を満たしていない
・レイアウトやスタイルが整っていない
  デザインも操作方法も一貫していない
・理解が困難

2.3 Micropostsリソース
Usersリソースの次はMicropostsリソースを見ていく
UsersリソースとMicropostsリソースの構造の類似点を理解する

2.3.1 マイクロポストを探検する
scaffoldでMicropostsリソース生成
$ rails generate scaffold Micropost content:text user_id:integer

新しいデータモデルでDBを更新するには、マイグレーションを実行する
$ rails db:migrate

リスト2.12 Railsルートで使うMicropostsリソース用のルール
表2.3 MicropostsリソースのHTTPリクエストメソッド	URL	アクション	用途

リスト2.13 Micropostsコントローラの骨格
Usersコントローラと完全に同一

マイクロポストのインデックスページで実際にマイクロポストをいくつか作ってみる

2.3.2 マイクロポストをマイクロにする
マイクロポストに文字数制限を与えてみる
リスト2.１４ 最大１４０字にする
app/models/micropost.rb
validates :content, length: { maximum: 140 }

2.3.3 ユーザーはたくさんマイクロポストを持っている
異なるデータモデル同士の関連付けはrailsの強力な機能
今回はUserモデルとMicropostsモデルを関連づけ

リスト2.15 1人のユーザーに対し複数のマイクロポスト
app/model/user.rb
    has_many :microposts

リスト2.16 １つのマイクロポストは1人のユーザーにのみ属する
app/model/micropost.rb
    belongs_to :user

リスト2.17 railsコンソールでアプリケーションの状態を調べる
$ rails console
>> first_user = User.first
first_userに1人目のユーザーを代入

>> first_user
first_userを表示する

>> first_user.microposts
first_userの投稿を表示する

>> micropost = first_user.microposts.first
micropostにfirst_userに１つ目の投稿を代入

2.3.4 　継承の階層
Railsのコントローラとモデルのクラス階層について

リスト2.20 2.21 図2.20 モデルの継承構造
User < ApplicationRecord < ActiveRecord::Base

リスト2.22 2.23 2.24 図2.21 コントローラの継承構造
Users < ApplicationController < ActionController::Base

2.4 最後に

2.4.1 まとめ
・scaffoldでコードを自動生成すると、Web上からデータモデルにアクセスし、やりとりできるようになる
・scaffoldは素早く開発するための機能で、学習用ではないため、scaffoldだけではrailsを理解するのは難しい
・railsでは、webアプリケーションの構成にMVC（model-view-controller）というアーキテクチャを採用している
・railsでは、HTTP requestメソッドと送信先（url）に応じて、呼び出されるコントローラやアクションが決まる
・railsでは、データのバリデーション(validation)がサポートされており、データモデルの値に制限をかけられる
・railsには、データモデル同士を関連付けするための様々なメソッド(has_manyなど)が用意されている
・railsコンソールを使うと、コマンドラインからrailsアプリを操作できる