【Rails】CRUD処理の基本フロー

# はじめに
Ruby on Railsの醍醐味と言って良いCRUD処理について学習したのでその基本フローをTODOアプリを例にして実装と気になる点などをまとめてみました！

## CRUD処理とは？
CRUD処理とは以下の4つの操作の頭文字を取ったものです
- **Create**: データを新しく作成する
- **Read**: データを読み取る
- **Update**: データを更新する
- **Delete**: データを削除する

### ステップ1: Railsアプリケーションを作成
Railsアプリケーションを作成する際に`rails new`コマンドを使ってアプリケーションの雛形を作成します
```bash
rails new todo_app
```
## ステップ2: Todoモデルの作成
`rails generate model`コマンドでモデルを作成します
ちなみに`generate`は`g`のみで省略可能です
```bash
rails g model Todo title:string description:text completed:boolean
```

- Todo:モデル名
- title:カラム名
- string:データ型

このコマンドで、以下のようなマイグレーションファイルが生成されます
```ruby:ruby
class CreateTodos < ActiveRecord::Migration[7.0]
  def change
    create_table :todos do |t|
      t.string :title
      t.text :description
      t.boolean :completed, default: false

      t.timestamps
    end
  end
end
```

次に、マイグレーションを実行します
```bash
rails db:migrate
```

## ステップ3:コントローラーの作成
`rails g controller`コマンドでコントローラーの作成をします
```bash
rails g controller Todos index
```
- Todos:コントローラー名(コントローラー名は複数形)
- index:アクション名

### ルーティングの設定
```ruby:routes.rb
Rails.application.routes.draw do
  resources :todos
end
```
**ポイント**
`resources`メソッドを使うことによりCRUD操作に対応するルートを一括で生成できます
以下のルートが自動的に生成されます
|HTTPメソッド|	パス	|コントローラーのアクション|	用途|
|-----------|-------|----------------------|----|
|GET	|/todos	|todos#index	|全てのTODOリストを表示|
|GET	|/todos/new	|todos#new	|新しいTODOの入力フォームを表示|
|POST	|/todos	|todos#create	|新しいTODOを作成|
|GET	|/todos/:id	|todos#show	|特定のTODOを表示|
|GET	|/todos/:id/edit	|todos#edit	|特定のTODOの編集フォームを表示|
|PATCH/PUT	|/todos/:id	|todos#update	|特定のTODOを更新|
|DELETE	|/todos/:id	|todos#destroy	|特定のTODOを削除|

**indexアクションの実装**
以下はコントローラーになります
```ruby:todos_controller.rb
class TodosController < ApplicationController
  def index
    @todos = Todo.all
  end
end
```
`.all`とは`ActiveRecord`によって提供されるクラスメソッドであり`todos`テーブルに保存されているすべてのレコードを取得することができます

以下はビューになります
```erb:index.html.erb
<h1>ToDo一覧</h1>

<%= link_to '新しいToDoを作成', new_todo_path %>

<ul>
  <% @todos.each do |todo| %>
    <li>
      <%= link_to todo.title, todo_path(todo) %>
    </li>
  <% end %>
</ul>
```

### CRUD処理の実装
#### 1. Createの実装
**newアクションとcreateアクションの実装**
以下はコントローラーのになります
```ruby:todos_controller.rb
class TodosController < ApplicationController
  # ~省略~
  def new
    @todo = Todo.new
  end

  def create
    @todo = Todo.new(todo_params)
    if @todo.save
      redirect_to @todo, notice: 'ToDoが作成されました！'
    else
      render :new
    end
  end

  private

  def todo_params
    params.require(:todo).permit(:title, :description, :completed)
  end
end
```
**ポイント**
以下のコードはRailsのコントローラー内のプライベートメソッドで、ストロングパラメータを定義しています
これにより、外部から送信されたパラメータ（params）の中で、安全に許可されたデータだけを抽出することができる
```ruby:todos_controller.rb
private

def todo_params
  params.require(:todo).permit(:title, :description, :completed)
end
```

以下はビューのコードになります
```erb:new.html.erb
<h1>新しいToDoを作成</h1>

<%= form_with model: @todo, local: true do |form| %>
  <div>
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>
  <div>
    <%= form.label :description %>
    <%= form.text_area :description %>
  </div>
  <div>
    <%= form.label :completed %>
    <%= form.check_box :completed %>
  </div>
  <div>
    <%= form.submit '作成' %>
  </div>
<% end %>
```

#### 2. Readの実装
**showアクションの実装**
以下はコントローラーになります
```ruby:todos_controller.rb
class TodosController < ApplicationController
  # ~省略~
  def show
    @todo = Todo.find(params[:id])
  end
end
```

以下はビューのコードになります
```erb:show.html.erb
<h1><%= @todo.title %></h1>
<p><%= @todo.description %></p>
<p><%= @todo.completed ? '完了済み' : '未完了' %></p>
<%= link_to '編集', edit_todo_path(@todo) %>
<%= link_to '削除', @todo, method: :delete, data: { confirm: '本当に削除しますか？' } %>
<%= link_to '戻る', todos_path %>
```

#### 3. Updateの実装
**editアクションとupdateアクションの実装**
以下はコントローラーになります
```ruby:todos_controller.rb
class TodosController < ApplicationController
  # ~省略~
  def edit
    @todo = Todo.find(params[:id])
  end

  def update
    @todo = Todo.find(params[:id])
    if @todo.update(todo_params)
      redirect_to @todo, notice: 'ToDoが更新されました！'
    else
      render :edit
    end
  end
end
```

以下はビューのコードになります
```erb:edit.html.erb
<h1>ToDoを編集</h1>

<%= form_with model: @todo, local: true do |form| %>
  <div>
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>
  <div>
    <%= form.label :description %>
    <%= form.text_area :description %>
  </div>
  <div>
    <%= form.label :completed %>
    <%= form.check_box :completed %>
  </div>
  <div>
    <%= form.submit '更新' %>
  </div>
<% end %>
```

#### 4. Deleteの実装
**deleteアクションの実装**
以下はコントローラーになります
```ruby:todos_controller.rb
class TodosController < ApplicationController
  def destroy
    @todo = Todo.find(params[:id])
    @todo.destroy
    redirect_to todos_path, notice: 'ToDoが削除されました！'
  end
end
```

# まとめ
以上がCRUD処理についての基本フローになります。CRUD処理はウェブアプリケーションにおける基本であり、最も頻繁に使われる操作です。この一連の流れをしっかりと理解して**モデルとデータベースの連携**、**コントローラーの役割**、**ビューの重要性**、この関係性をいイメージしながら今後はより複雑なアプリケーション開発へ挑戦していきたいです！