LoginSignup
0
0

More than 3 years have passed since last update.

【Rails】アプリ作成の流れ②【CRUD機能】

Last updated at Posted at 2020-08-31

前回は

アプリ作成からデプロイまでしました。
https://qiita.com/ksyantaro/private/b2640573d1af18becece

前回、scaffoldで作成しましたが、今回は1から作っていきます!

目次

  1. CRUD機能(サーバー)
  2. CRUD機能(ビュー)
  3. やっぱり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
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