前回は
アプリ作成からデプロイまでしました。
https://qiita.com/ksyantaro/private/b2640573d1af18becece
前回、scaffoldで作成しましたが、今回は1から作っていきます!
目次
- CRUD機能(サーバー)
- CRUD機能(ビュー)
- やっぱりnewもeditも作成したい
CRUD機能(サーバー)
- 登録機能(Create)
- 参照機能(Read)
- 変更機能(Update)
- 削除機能(Delete)
登録機能(Create)
- SQLにおけるINSERT。
- フォームに入力し、ボタンを押してデータベースに情報を保存。
- 特定のページにアクセスしたときのデータを保存はデータ表示の際に保存。
blogs_controller.rb
def create
@blog = Blog.new(blog_params)
if @blog.save
redirect_to @blog, notice: 'ブログを投稿しました'
else
render :new
end
end
blogs_controller.rb
def index
@blog = Blog.new
end
※というように空のインスタンス変数を作成しないと
indexから直接createのときは機能しないから注意!
参照機能(Read)
- SQLにおけるSELECT
- 情報を表示するページ
- 表示すると他の情報の登録や変更をするコードを書いたときは注意
blogs_controller.rb
def index
@blogs = Blog.all
end
def show
@blog = Blog.find(params[:id])
end
変更機能(Update)
- SQLにおけるUPDATE
- 入力フォームと変更ボタンで更新する
blogs_controller.rb
def update
@blog = Blog.find(params[:id])
if @blog.update(blog_params)
redirect_to @blog, notice: 'ブログを更新しました'
else
render :show
end
end
※index→createのときみたいに空のインスタンスを作る必要はない。すでにあるデータなので。
あまりこんなことはしないと思うけど笑
削除機能(Delete)
- SQLにおけるDELETE
- データベースにすでにある情報を削除する。
- dependentオプションで関連する情報を消すことができる。
blogs_controller.rb
def destroy
@blog = Blog.find(params[:id])
@blog.destroy
redirect_to blogs_path, notice: 'ブログを削除しました'
end
最後にblog_paramsを忘れずに
blogs_controller.rb
private
def blog_params
params.require(:blog).permit(:title, :text)
end
CRUD機能(ビュー)
gem 'haml-rails'を入れる。
rails haml:erb2hamlを打つ。
C(indexを投稿画面とした場合)
index.html.haml
= form_with model: @blog do |f|
= f.text_field :title
= f.text_area :text
= f.submit "SEND"
R(一覧表示と詳細表示)
index.html.haml
- @blogs.each do |blog|
= blog.title
= blog.text
= link_to '詳細ページ', blog_path(blog.id)
show.html.haml
= @blog.title
= @blog.text
= link_to '一覧ページ', blogs_path
U(showを更新画面とした場合)
ちなみにあまりこんなことはしない。
show.html.haml
= form_with(model: @blog, local: true) do |f|
= f.text_field :title
= f.text_area :text
= f.submit "SEND"
上記のlocal: trueは
デフォルトでajax通信に設定されているのをキャンセルする記述。
D(showページに削除ボタン)
show.html.haml
= link_to '削除する', blog_path(@blog), method: :delete
※実はパスの指定の仕方だけどここから学ぶことが2つ。
1つ目は、blog_pathは、methodがgetかdeleteかで、編集か削除かが変わってくる。
2つ目は、index.html.hamlのときは、blog_pathの引数がblog.idになっていたのは、繰り返し処理で使われていたから。
そして、@blogが定義されていないから。
newもeditもやっぱり作成。
blogs_controller.rb
resources :blogs
上記に変更する。
new
blogs_controller.rb
def index
@blogs = Blog.all
# @blog = Blog.new
end
def new
@blog = Blog.new
end
index.html.haml
= link_to "新規作成ページ", new_blog_path
new.html.haml
= form_with model: @blog do |f|
= f.text_field :title
= f.text_area :text
= f.submit "SEND"
edit
blogs_controller.rb
def edit
@blog = Blog.find(params[:id])
end
show.html.haml
= link_to '編集する', edit_blog_path(@blog), method: :get
edit.html.haml
= form_with model: @blog do |f|
= f.text_field :title
= f.text_area :text
= f.submit "SEND"
まとめ
ということでCRUD機能を実装していきました。
見た目は実装していませんが、とりあえずこれで終了します。
blogs_controller.rb
class BlogsController < ApplicationController
def index
@blogs = Blog.all
end
def new
@blog = Blog.new
end
def create
@blog = Blog.new(blog_params)
if @blog.save
redirect_to blogs_path, notice: 'ブログを投稿しました'
else
render :index
end
end
def show
@blog = Blog.find(params[:id])
end
def edit
@blog = Blog.find(params[:id])
end
def update
@blog = Blog.find(params[:id])
if @blog.update(blog_params)
redirect_to @blog, notice: 'ブログを更新しました'
else
render :show
end
end
def destroy
@blog = Blog.find(params[:id])
@blog.destroy
redirect_to blogs_path, notice: 'ブログを削除しました'
end
private
def blog_params
params.require(:blog).permit(:title, :text)
end
end