はじめに
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
コマンドでモデルを作成します
ちなみにgenerate
はg
のみで省略可能です
rails g model Todo title:string description:text completed:boolean
- Todo:モデル名
- title:カラム名
- string:データ型
このコマンドで、以下のようなマイグレーションファイルが生成されます
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:アクション名
ルーティングの設定
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アクションの実装
以下はコントローラーになります
class TodosController < ApplicationController
def index
@todos = Todo.all
end
end
.all
とはActiveRecord
によって提供されるクラスメソッドでありtodos
テーブルに保存されているすべてのレコードを取得することができます
以下はビューになります
<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アクションの実装
以下はコントローラーのになります
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)の中で、安全に許可されたデータだけを抽出することができる
private
def todo_params
params.require(:todo).permit(:title, :description, :completed)
end
以下はビューのコードになります
<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アクションの実装
以下はコントローラーになります
class TodosController < ApplicationController
# ~省略~
def show
@todo = Todo.find(params[:id])
end
end
以下はビューのコードになります
<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アクションの実装
以下はコントローラーになります
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
以下はビューのコードになります
<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アクションの実装
以下はコントローラーになります
class TodosController < ApplicationController
def destroy
@todo = Todo.find(params[:id])
@todo.destroy
redirect_to todos_path, notice: 'ToDoが削除されました!'
end
end
まとめ
以上がCRUD処理についての基本フローになります。CRUD処理はウェブアプリケーションにおける基本であり、最も頻繁に使われる操作です。この一連の流れをしっかりと理解してモデルとデータベースの連携、コントローラーの役割、ビューの重要性、この関係性をいイメージしながら今後はより複雑なアプリケーション開発へ挑戦していきたいです!