0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

はじめに

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

CRUD処理とは?

CRUD処理とは以下の4つの操作の頭文字を取ったものです

  • Create: データを新しく作成する
  • Read: データを読み取る
  • Update: データを更新する
  • Delete: データを削除する

ステップ1: Railsアプリケーションを作成

Railsアプリケーションを作成する際にrails newコマンドを使ってアプリケーションの雛形を作成します

rails new todo_app

ステップ2: Todoモデルの作成

rails generate modelコマンドでモデルを作成します
ちなみにgenerategのみで省略可能です

rails g model Todo title:string description:text completed:boolean
  • Todo:モデル名
  • title:カラム名
  • string:データ型

このコマンドで、以下のようなマイグレーションファイルが生成されます

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

次に、マイグレーションを実行します

rails db:migrate

ステップ3:コントローラーの作成

rails g controllerコマンドでコントローラーの作成をします

rails g controller Todos index
  • Todos:コントローラー名(コントローラー名は複数形)
  • index:アクション名

ルーティングの設定

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アクションの実装
以下はコントローラーになります

todos_controller.rb
class TodosController < ApplicationController
  def index
    @todos = Todo.all
  end
end

.allとはActiveRecordによって提供されるクラスメソッドでありtodosテーブルに保存されているすべてのレコードを取得することができます

以下はビューになります

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アクションの実装
以下はコントローラーのになります

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)の中で、安全に許可されたデータだけを抽出することができる

todos_controller.rb
private

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

以下はビューのコードになります

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アクションの実装
以下はコントローラーになります

todos_controller.rb
class TodosController < ApplicationController
  # ~省略~
  def show
    @todo = Todo.find(params[:id])
  end
end

以下はビューのコードになります

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アクションの実装
以下はコントローラーになります

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

以下はビューのコードになります

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アクションの実装
以下はコントローラーになります

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?