CRUD処理
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処理ができるアプリを作成します。
下準備
- アプリ作成
$ rails new アプリケーション名(アプリ作成)
- プラグインを入力
アプリケーション名 $ プラグインを入力
- 環境設定記述
※環境設定は、開発環境により書き方が変わる
・個人の場合
エラー画面のconfig.hosts << "~.vfs.cloud9.us-east-1.amazonaws.com"」をコピーして追加
+config.hosts << 〇〇〇〇〇〇〇.vfs.cloud9.us-east-1.amazonaws.com
・複数のホストからRailsアプリケーションにアクセスする場合は下記を追加
+config.hosts.clear
このような画面が表示されていれば、問題なくアプリケーションが動作しています。
モデル作成
モデル名:List
カラム:title (string型),body (string型)
$ rails g model List title:string body:string
$ rails db:migrate
rails db:migrateを入力したら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をルートパスに指定
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 メソッドは、ルーティングを一括して自動生成してくれる機能
上記の記述を編集
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)を追加
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コントローラーを編集
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を編集
+<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コントローラーを編集
def index
+ @lists = List.all # 保存したすべてのデータを.allを使用して表示する。
end
一覧画面viewを編集
+<h1>投稿一覧</h1>
+
+<%= @lists.each do |list| %>
+
+ <p>タイトル</p>
+ <span><%= list.title %></span>
+
+<% end %>
EX.遷移先記述
遷移先記述
トップ画面に、新規投稿画面と投稿一覧画面の遷移先リンクを追記する。
+<h1>lesson_app</h1>
+
+<%= link_to "一覧画面", lists_path %>
+
+<%= link_to "新規投稿画面", new_list_path %>
詳細画面を作成
listsコントローラーを編集
def show
+ @list = List.find(params[:id]) #findメソッドは引数を受け取り、idカラムを引数と比べてレコードを取得してくるメソッド
#List.find(1) #listsテーブルの中にあるidが1のレコードを取得
#List.find(2) #listsテーブルの中にあるidが2のレコードを取得
end
詳細画面viewを編集
+<h2>タイトル</h2>
+<p><%= @list.title %></p>
+
+<h2>本文</h2>
+<p><%= @list.body %></p>
indexにshowへのリンクを追加
一覧ページから見たい投稿をクリックすることで詳細ページに遷移するため
<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へのリンクを追加
新規投稿ページから投稿した際、詳細ページに遷移し、投稿を確認できるようにするため
def create
list = List.new(list_params)
list.save
- redirect_to root_path
+ redirect_to list_path(list.id) # 詳細画面へリダイレクト
end
投稿編集機能
routes.rb編集
データを編集するためのルーティング(update)を追加
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コントローラーを編集
def edit
+ @list = List.find(params[:id]) #findメソッドを使い、保存されているデータを取得
end
編集画面viewを編集
+<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 %>
詳細画面に編集画面へのリンクを追加
<h2>タイトル</h2>
<p><%= @list.title %></p>
<h2>本文</h2>
<p><%= @list.body %></p>
+<%= link_to "編集", edit_list_path(@list.id) %>
投稿削除機能を作成
routes.rb編集
データを削除するためのルーティング(destroy)を追加
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コントローラーを編集
+def destroy
+ list = List.find(params[:id]) # データ(レコード)を1件取得
+ list.destroy # データ(レコード)を削除
+ redirect_to lists_path # 投稿一覧画面へリダイレクト
+end
詳細画面に編集画面へのリンクを追加
<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