Rails scaffoldとは何か?

# はじめに
Ruby on Railsのscaffoldについて理解を深める為にまとめてみました

# Rails scaffoldとは
scaffoldとは、Railsに備わっているコマンドの１つで以下のものを自動作成してくれる
* Routing
* Controller
* View
* Model
* Table(Database)の記述
* その他ファイル等

### scaffoldを使って作成されるルーティング
Railsが定める以下の７つのアクションが作成される
* `index`
* `show`
* `new`
* `edit`
* `create`
* `update`
* `destroy`

# 使い方
Railsプロジェクトのあるディレクトリにて下記コマンドを実行する
`rails g scaffold モデル名 カラム名①:データの型① カラム名②:データの型②・・・`

```zsh
# scaffoldコマンドの例
# Userモデル nameカラム:文字型, emailカラム:文字型
rails g scaffold User name:string email:string
```

# 生成されるファイル
## マイグレーションファイル
テーブル操作に欠かせないファイル
テーブルの作成や削除、カラムの追加・変更などを行うことができる。
生成されるファイル名にはタイムスタンプが付与される

* `db/migrate/[タイムスタンプ]_create_user.rb`

### テーブル作成
マイグレーションファイルを使用してテーブルを作成する場合、下記のコマンドを実行する
```zsh
rails db:migrate
```
このコマンドを実行することでマイグレーションファイルの内容をデータベースに反映させることができる
今回で言うと以下のテーブルが作成される

```mermaid
erDiagram
users {
  id integer
  name string
  email string
}
```

## モデル
モデルはMVCの中のMに該当する部分、以下のファイルが生成される
* `app/models/user.rb`

### モデルとは
データベースのテーブルに対応するRubyのクラスです。
モデルクラスのインスタンスは、1つのレコードを表すオブジェクトになり、テーブルのカラムに相当する属性を持つ

例えば、商品情報のモデルクラスがあると、そのインスタンス(オブジェクト)は「商品名」や「価格」などの属性を持つ
![スクリーンショット 2023-04-16 17.30.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2860566/cdffff93-6b8d-cf05-2ce2-bce39d218838.png)


#### モデルの命名規則
モデルのクラス名は**頭が大文字の単数形**


## コントローラーファイル
モデルとビューを制御するために使われる、以下のファイルが生成される
* `app/controllers/users_controller.rb`

中身は以下の様になっている
```app/controllers/users_controller.rb
class UsersController < ApplicationController

  def index
   # 処理を記述
  end

  def show
   # 処理を記述
  end

  def new
    # 処理を記述
  end

  def edit
    # 処理を記述
  end

  def create
    # 処理を記述
  end

  def update
    # 処理を記述
  end
  
  def destroy
    # 処理を記述
  end

end
```

## ルーティング
クライアントサイドからのリクエストに対してコントローラーで設定したアクションと結びつける働きをする
* `config/routes.rb`

以下のファイルが生成される
```config/routes.rb
Rails.application.routes.draw do
  get 'users/sign_in'
 
  get 'users/sign_up'
 
  get 'pages/top'
 
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```

## ビュー
表示と入力を制御する
以下の5つのファイルが生成される
#### `index`
* `app/views/users/index.html.erb`
#### `edit`
* `app/views/users/edit.html.erb`
#### `show`
* `app/views/users/show.html.erb`
#### `new`
* `app/views/users/new.html.erb`
#### `form`
* `app/views/users/_form.html.erb`

## ヘルパー
`app/helpers`配下に、`users_helper.rb`というファイルが生成される
デフォルトでは中身は何も記述されていない

※ヘルパーとは**RailsのViewをシンプル書くことが出来る機能**
```app/helpers/users_helper.rb
module UsersHelper
end
```

## アセット(Sassファイル)
スタイルを制御するscssファイル
`app/assets/stylesheets/`配下に以下の2つのファイルが生成される

* `app/assets/stylesheets/<コントローラ名>.scss`
* `app/assets/stylesheets/scaffolds.scss`

:::note warn
`app/assets/stylesheets/<コントローラ名>.scss`に記述した内容は`application.css`に統合されるので全体に適用される
:::

### scaffoldのオプションでscssファイルを生成しないようにする
`rails g scaffold`実行時に`--no-scaffold-stylesheets`オプションをつけることで生成しないようすることが出来る

## jbuilderファイル
jbuilderファイルはJSON形式のデータを生成するためのファイル
以下の3つのファイルが生成される

* `app/views/users/index.json.jbuilder`
* `app/views/users/show.json.jbuilder`
* `app/views/users/_user.json.jbuilder`

## テスト用ファイル
以下の4つのテストファイルが生成される
* `test/models/users_test.rb`	
→ モデルテスト
* `test/fixtures/users.yml`
→ フィクスチャテスト
* `test/controllers/users_controller_test.rb`
→ コントローラテスト
* `test/system/users_test.rb`
→ システムテスト

# 参考記事
[Rails scaffoldを初心者向けに解説！実際にアプリを作ってみよう！](https://udemy.benesse.co.jp/development/system/scaffold.html 'Rails scaffold初心者向け')
[Rails scaffoldの使い方とメリット・デメリット【初心者向け】](https://techplay.jp/column/612 'Rails scaffoldの使い方')
[【Rails入門】データベースを設定するrails db:migrateを説明！](https://www.sejuku.net/blog/14229 'rails db:migrate')
[【Rails】 マイグレーションファイルを徹底解説！](https://pikawaka.com/rails/migration 'Railsマイグレーションファイル')
[Railsのmodelを徹底解説！知っておくべき3つの知識も紹介](https://udemy.benesse.co.jp/development/system/rails-model.html 'Railsのモデル')
[【Rails】超便利コマンドscaffoldの使い方を完全理解｜何が起こっているかを徹底解説](https://prograshi.com/framework/rails/scaffold/ 'scaffold')