Scaffoldを複数使ってみた

# はじめに
はじめまして。今回初めて記事を書きます。にゃこすと申します。よろしくお願いいたします。
今回のテーマは「Scaffoldを複数使ってみた」です。
Scaffoldはプログラミング学習を始めてかなり序盤に学習したので、現役エンジニアの方が思いつかない発想かもしれないなと思い、記事を書いてみます。
※初学者による記事のため正確性に欠ける場合があります。記事についてお気づきの点がございましたらご指摘いただけますと幸いです。

# scaffoldって？
"アプリケーションの基本的な機能の一覧(index)、詳細(show)、新規作成(new/create)、編集(edit/update)、削除(destroy)するために必要なコントローラ、モデル、ビューをまとめて生成"できる便利なコマンドです。
--引用元 <cite>[Railsドキュメント](https://railsdoc.com/page/rails_scaffold)</cite>

# なんでScaffoldを複数使おうと思ったの？
Webアプリを作成している際に、タスク管理アプリも掲示板アプリも欲しい！！となったことがきっかけです。
どちらか片方を作ったり、掲示板アプリを作ってからコメント機能をつけたり等の機能拡張をやってみたことはありましたが、
両方Scaffoldってやってみたことないな、、、やったらどうなるの？と思い試してみました。

# さっそく実践
タスク管理⇨掲示板の順番で作ってみようと思います。
```
rails new test_scaffolds
```
![スクリーンショット 2023-10-11 22.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/9f49d378-6e5c-0766-f86a-1ef38bfba8fe.png)

まずはアプリを作成しました。まだmodel, view, controllerは作成されていない状態です。
ここで1回目のscaffoldを実行してみます。
```
bin/rails g scaffold Task title:string body:string deadline:datetime
```
カラムはアプリに適したものを設定していただければ良いですが、今回は
「タスクも掲示板もtitleとbodyにならないか、、、？」
と気づいたので急遽締切を入力するdeadlineカラムも作ってみました。
```
invoke  active_record
      create    db/migrate/20231011132841_create_tasks.rb
      create    app/models/task.rb
      invoke    test_unit
      create      test/models/task_test.rb
      create      test/fixtures/tasks.yml
      invoke  resource_route
       route    resources :tasks
      invoke  scaffold_controller
      create    app/controllers/tasks_controller.rb
      invoke    erb
      create      app/views/tasks
      create      app/views/tasks/index.html.erb
      create      app/views/tasks/edit.html.erb
      create      app/views/tasks/show.html.erb
      create      app/views/tasks/new.html.erb
      create      app/views/tasks/_form.html.erb
      invoke    test_unit
      create      test/controllers/tasks_controller_test.rb
      create      test/system/tasks_test.rb
      invoke    helper
      create      app/helpers/tasks_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/tasks/index.json.jbuilder
      create      app/views/tasks/show.json.jbuilder
      create      app/views/tasks/_task.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/tasks.coffee
      invoke    scss
      create      app/assets/stylesheets/tasks.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss
```
自動でこんなに沢山のファイルを作ってくれます。便利ですね〜
いらないものは最初からオプションでスキップできます。
一度できたアプリを見てみます。
```
bin/rails db:migrate
```
```
bin/rails s
```
`http://localhost:3000/tasks`にアクセスします。
![スクリーンショット 2023-10-11 22.39.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/adfdbaba-3898-e804-b2c0-ea9ac22f54e4.png)

おお〜！
念の為動作確認もしてみます。
![スクリーンショット 2023-10-11 22.40.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/e17eee93-5aa3-eccf-722e-6cfa901de7e7.png)
![スクリーンショット 2023-10-11 22.41.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/4769bde2-c93f-d438-f106-7da09f1043e8.png)
![スクリーンショット 2023-10-11 22.42.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/cd0ce966-c04b-a739-5dde-cfc7b64424eb.png)

UTCなのね、、、！
UTCをJSTに変更する方法は他の記事に譲ります、、、

続いて、2回目のscaffoldを実行してみます！
作業ディレクトリはそのままで大丈夫です。
```
bin/rails g scaffold Board title:string body:string
```
```
invoke  active_record
      create    db/migrate/20231011134516_create_boards.rb
      create    app/models/board.rb
      invoke    test_unit
      create      test/models/board_test.rb
      create      test/fixtures/boards.yml
      invoke  resource_route
       route    resources :boards
      invoke  scaffold_controller
      create    app/controllers/boards_controller.rb
      invoke    erb
      create      app/views/boards
      create      app/views/boards/index.html.erb
      create      app/views/boards/edit.html.erb
      create      app/views/boards/show.html.erb
      create      app/views/boards/new.html.erb
      create      app/views/boards/_form.html.erb
      invoke    test_unit
      create      test/controllers/boards_controller_test.rb
      create      test/system/boards_test.rb
      invoke    helper
      create      app/helpers/boards_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/boards/index.json.jbuilder
      create      app/views/boards/show.json.jbuilder
      create      app/views/boards/_board.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/boards.coffee
      invoke    scss
      create      app/assets/stylesheets/boards.scss
      invoke  scss
   identical    app/assets/stylesheets/scaffolds.scss
```
VSCodeの左側もだいぶ賑やかになってきています！
![スクリーンショット 2023-10-11 22.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/9f2a5868-351a-6282-ca98-24d76f7f0235.png)

ここでもう一度できたアプリを見てみましょう。
```
bin/rails db:migrate
```
```
bin/rails s
```
![スクリーンショット 2023-10-11 22.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/fef7a64b-2c3b-bfb0-312e-7d2e816b1c6b.png)

作成できています。
こちらも動作確認をします。
![スクリーンショット 2023-10-11 22.52.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/01410111-7530-2f5b-b865-c4fa07220daa.png)
![スクリーンショット 2023-10-11 22.52.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/c44bc764-bc8a-1479-1583-3065df403831.png)
![スクリーンショット 2023-10-11 22.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/e1e0fe9e-9fc7-34cf-956b-1b2d89885889.png)

こちらも問題なさそうですね。
というわけで、1つのアプリの中でScaffoldは複数使えることがわかりました！

# 仕上げ
せっかく2つの機能を1つのアプリに閉じ込めたので、相互にアクセスできるようにしないと意味ないですよね。
また、rootパスも`Yay! You’re on Rails!`のままなので変更していきます。
```
Rails.application.routes.draw do
  root to: 'tasks#index' # この行を追記
  resources :boards
  resources :tasks
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```
サーバーを起動して確認します。
```
bin/rails s
```
![スクリーンショット 2023-10-11 22.59.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/e256232c-fc6d-a122-c14f-2c848b66d3cc.png)

rootパスに設定できました。

次にTasksからBoradsへ、BoardsからTasksへのリンクをそれぞれ作成します。
```
<p id="notice"><%= notice %></p>

<h1>Tasks</h1>

<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Body</th>
      <th>Deadline</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @tasks.each do |task| %>
      <tr>
        <td><%= task.title %></td>
        <td><%= task.body %></td>
        <td><%= task.deadline %></td>
        <td><%= link_to 'Show', task %></td>
        <td><%= link_to 'Edit', edit_task_path(task) %></td>
        <td><%= link_to 'Destroy', task, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Task', new_task_path %> |
<%= link_to 'Go to Boards', boards_path %> # |以降を追記
```
```
（Taskとほぼ同じなので省略）

<%= link_to 'New Board', new_board_path %>|
<%= link_to 'Go to Tasks', tasks_path %> # |以降を追記
```

サーバーを起動して確認します。
```
bin/rails s
```
![スクリーンショット 2023-10-11 23.05.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/72ca7910-5201-6171-8fb9-c7ec623f4e72.png)
![スクリーンショット 2023-10-11 23.05.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575308/0ff7add9-3b85-d31d-e481-bd40436ec365.png)

お互いにリンクを作成することができました！！

# おわりに
何もない0から1を生み出すのは大変ですが、scaffoldから少しずつ機能を足していったり、逆に不要なものを後から削ってみたり、あるものから試行錯誤するのはいくらかやりやすいのではないでしょうか！
scaffoldって複数でも使えるんだ！面白い！と思っていただけたら幸いです。