📝

CRUD処理

2023/11/24に公開

CRUD処理

CRUDはデータベースに対して行う基本的な処理で、以下の4つを指します。

create(作成)

例:list.save

read(読み取り)

例:List.all, List.find(params[:id])

update(更新)

例:list.update(list_params)

destroy(削除)

例:list.destroy
それぞれの頭文字をとってCRUDと言います。

CRUDはデータベースの基本的な処理のことで、create, read, update, destroyの頭文字から作成しています。
Railsでは保存、取得、更新、削除のことを指します。
例えば、保存(list.save)、レコードの取得(List.allやList.find(params[:id])など)、更新(list.update(list_params))、
削除(list.destroy)のことです。

今回は、CRUD処理ができるアプリを作成します。

下準備

  1. アプリ作成
ターミナル
$ rails new アプリケーション名(アプリ作成)
  1. プラグインを入力
ターミナル
アプリケーション名 $ プラグインを入力
  1. 環境設定記述
    ※環境設定は、開発環境により書き方が変わる
    ・個人の場合
    エラー画面のconfig.hosts << "~.vfs.cloud9.us-east-1.amazonaws.com"」をコピーして追加
config/environments/development.rb
+config.hosts << 〇〇〇〇〇〇〇.vfs.cloud9.us-east-1.amazonaws.com

・複数のホストからRailsアプリケーションにアクセスする場合は下記を追加

config/environments/development.rb
+config.hosts.clear

このような画面が表示されていれば、問題なくアプリケーションが動作しています。
#

モデル作成

モデル名:List
カラム:title (string型),body (string型)

ターミナル
$ rails g model List title:string body:string
ターミナル
$ rails db:migrate

rails db:migrateを入力したらschema.rbを確認し、反映されてることを確認

db/schema.rb
ActiveRecord::Schema.define(version: migrate日時) do

  create_table "lists", force: :cascade do |t|
    t.string "title"
    t.string "body"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

end

コントローラー,view,Routing作成

トップ画面関連作成

ターミナル
$ rails g controller homes top

今回はListモデル==投稿関連にする
リスト画面関連作成

ターミナル
$ rails g controller lists new index show edit

ルートパス指定

homes/topをルートパスに指定

config/routes.rb
Rails.application.routes.draw do
- get 'homes/top'
+ root 'homes#top' #ルートパスに指定
  get 'lists/new'
  get 'lists/index'
  get 'lists/show'
  get 'lists/edit'
end

resources

resources メソッドは、ルーティングを一括して自動生成してくれる機能
上記の記述を編集

config/routes.rb
Rails.application.routes.draw do
  root 'homes#top'
- get 'lists/new'
- get 'lists/index'
- get 'lists/show'
- get 'lists/edit'
+ resources :lists, only: [:new, :index, :show, :edit]
end

投稿機能を作成

routes.rb編集

データを追加(保存)するためのルーティング(create)を追加

config/routes.rb
Rails.application.routes.draw do
  root 'homes#top'
- resources :lists, only: [:new, :index, :show, :edit]
+ resources :lists, only: [:new, :create, :index, :show, :edit]
end

listsコントローラーを編集

app/controllers/lists_controller.rb
  def new    
+   @list = List.new # Viewへ渡すためのインスタンス変数に空のModelオブジェクトを生成する。
  end
  
+ def create# 保存機能を追加
+   list = List.new(list_params) # 1.&2. データを受け取り新規登録するためのインスタンス作成
+   list.save # 3. データをデータベースに保存するためのsaveメソッド実行
+   redirect_to root_path # 4. 一時的にトップ画面へリダイレクト
+ end
  :
  :省略
  :
+ private # ストロングパラメータ
+ def list_params# 保存機能を追加
+   params.require(:list).permit(:title, :body)
+ end

新規投稿viewを編集

app/views/lists/new.html.erb
+<h1>新規投稿</h1>
+<%= form_with model: List.new do |f| %>
+  <h4>タイトル</h4>
+  <%= f.text_field :title %>
+
+  <h4>本文</h4>
+  <%= f.text_area :body %>
+
+  <%= f.submit '投稿' %>
+<% end %>

一覧画面を作成

listsコントローラーを編集

app/controllers/lists_controller.rb
  def index
+   @lists = List.all # 保存したすべてのデータを.allを使用して表示する。
  end

一覧画面viewを編集

app/views/lists/index.html.erb
+<h1>投稿一覧</h1>
+
+<%= @lists.each do |list| %>
+
+  <p>タイトル</p>
+  <span><%= list.title %></span>
+
+<% end %>

EX.遷移先記述

遷移先記述

トップ画面に、新規投稿画面と投稿一覧画面の遷移先リンクを追記する。

app/views/homes/top.html.erb
+<h1>lesson_app</h1>
+
+<%= link_to "一覧画面", lists_path %>
+
+<%= link_to "新規投稿画面", new_list_path %>

詳細画面を作成

listsコントローラーを編集

app/controllers/lists_controller.rb
  def show
+   @list = List.find(params[:id]) #findメソッドは引数を受け取り、idカラムを引数と比べてレコードを取得してくるメソッド
    #List.find(1) #listsテーブルの中にあるidが1のレコードを取得
    #List.find(2) #listsテーブルの中にあるidが2のレコードを取得
  end

詳細画面viewを編集

app/views/lists/show.html.erb
+<h2>タイトル</h2>
+<p><%= @list.title %></p>
+
+<h2>本文</h2>
+<p><%= @list.body %></p>

indexにshowへのリンクを追加

一覧ページから見たい投稿をクリックすることで詳細ページに遷移するため

app/views/lists/index.html.erb
 <h1>投稿一覧</h1>
 
 <% @lists.each do |list| %>
 
   <p>タイトル</p>
-  <span><%= list.title %></span>
+  <span>
+    <%= link_to list.title, list_path(list.id) %>
+  </span>  
 <% end %>

newにshowへのリンクを追加

新規投稿ページから投稿した際、詳細ページに遷移し、投稿を確認できるようにするため

app/controllers/lists_controller.rb
 def create
     list = List.new(list_params)
     list.save
-    redirect_to root_path
+    redirect_to list_path(list.id) # 詳細画面へリダイレクト
 end

投稿編集機能

routes.rb編集

データを編集するためのルーティング(update)を追加

config/routes.rb
Rails.application.routes.draw do
  root 'homes#top'
- resources :lists, only: [:new, :create, :index, :show, :edit]
+ resources :lists, only: [:new, :create, :index, :show, :edit, :update]
end

listsコントローラーを編集

app/controllers/lists_controller.rb
  def edit
+   @list = List.find(params[:id]) #findメソッドを使い、保存されているデータを取得
  end

編集画面viewを編集

app/views/lists/edit.html.erb
+<h1>編集画面</h1>
+
+<%= form_with model: @list, url: list_path(@list.id), method: :patch do |f| %>
+
+  <h4>タイトル</h4>
+  <%= f.text_field :title %>
+
+  <h4>本文</h4>
+  <%= f.text_area :body %>
+
+  <%= f.submit '保存' %>
+
+<% end %>

詳細画面に編集画面へのリンクを追加

app/views/lists/show.html.erb
 <h2>タイトル</h2>
 <p><%= @list.title %></p>
 
 <h2>本文</h2>
 <p><%= @list.body %></p>
 
+<%= link_to "編集", edit_list_path(@list.id) %>

投稿削除機能を作成

routes.rb編集

データを削除するためのルーティング(destroy)を追加

config/routes.rb
Rails.application.routes.draw do
  root 'homes#top'
- resources :lists, only: [:new, :create, :index, :show, :edit, :update]  
+ resources :lists, only: [:new, :create, :index, :show, :edit, :update, :destroy]
end

listsコントローラーを編集

app/controllers/lists_controller.rb
+def destroy
+  list = List.find(params[:id])  # データ(レコード)を1件取得
+  list.destroy  # データ(レコード)を削除
+  redirect_to lists_path  # 投稿一覧画面へリダイレクト  
+end

詳細画面に編集画面へのリンクを追加

app/views/lists/show.html.erb
 <h2>タイトル</h2>
 <p><%= @list.title %></p>
 
 <h2>本文</h2>
 <p><%= @list.body %></p>
 
 <%= link_to "編集", edit_list_path(@list.id) %>
+<%= link_to "削除", list_path(@list.id), method: :delete, "data-confirm" => "本当に削除しますか?" %>

これでCRUD処理ざっくり完成!!

あとがき

自分の備忘録として作成しました。
今回初投稿で、先輩方の読みやすい記事の裏側の大変さを痛感しました。
自分のペースで投稿をやってみたいと思います。
間違ってるところ、おかしいところがあったらご指摘ください。

Discussion