見出し画像

(4)Railsで簡単なメモアプリを作ってみる

前回の作業で編集フォームと一覧表示が作成できました。
投稿 → (3)Railsで簡単なメモアプリを作ってみる

今回は削除機能を追加していきます。

destroyアクションの追加

config/routes.rb

resources :memo, only: [:new, :create, :edit, :update, :destroy]

スクリーンショット 2020-06-26 8.49.46

rails routesで確認すると、destroyが追加されています。
このようにroutes.rbを編集するとルーティングが生成され
機能への道筋を確保できるので、機能追加時は忘れないうちに
routes.rbを編集した方がいいと思っています。

controllerにdestroyアクション追加

app/controllers/memo_controller

def destroy
   post = Post.find(params[:id])
   post.destroy
   redirect_to root_path
 end

updateとほぼ同じです。
1行目でレコードを指定
2行目で削除
3行目でトップページへ遷移

ビューページの作成

ビューの作成と行ってもeditの時と同じで削除機能のリンクを貼るだけです。

app/views/memo/index.html.erb

<h1>Memo app</h1>
 <% @posts.each do |post| %>
 <ul>
     <li>
       <%= post.content %>
       <%= link_to "編集", edit_memo_path(post) %>
       <%= link_to "削除", memo_path(post.id), method: :delete %>
     </li>
 </ul>
<% end %>
<%= link_to '新規投稿', '/memo/new' %>

//追加した記述
 <%= link_to "削除", memo_path(post.id), method: :delete %>
ここで注目したいのがPrefixとmethodです。
・Prefix:memo_path(post.id)
はルーティングを確認していただくとわかりますがupdateと同じなんです。
あれ?何も書いてないじゃ無いか!

スクリーンショット 2020-06-26 9.06.55

これ実は省略されているだけで、全部memo_pathなんです。
僕は最初わからずPath(/memo/:id)使っていました。(汗
・method:method: :delete
ここでmethodを指定するとdestroyアクションが起動します。

ブラウザで確認すると削除機能が使えるようになりました。
http://localhost:3000/

スクリーンショット 2020-06-26 9.12.17

リファクタリング

機能実装がある程度終わったら可読性を上げるために
同じような記述をひとまとめにしていきます。

app/controllers/memo_controller.rb

def edit
   @post = Post.find(params[:id])
 end

 def update
   @post = Post.find(params[:id])
   @post.update(post_params)
   redirect_to root_path
 end
 
 def destroy
   @post = Post.find(params[:id])
   @post.destroy
   redirect_to root_path
 end

@post = Post.find(params[:id])
この記述が3つあるのがわかります。こちらをひとまとめにして
一文修正したら3つの箇所が変更されるようになると便利です。

private以下にset_postメソッドを追加します。

def set_post
   @post = Post.find(params[:id])
 end

before_actionを2行目あたりに追加します。

before_action
すでに定義されている各アクションの実行前に作動してくれる。
class MemoController < ApplicationController
 before_action :set_post, only: [:edit, :update, :destroy]

そしてedit,update,destroyメソッド内の
@post = Post.find(params[:id]を削除すればOKです。

最終的なmemo_controllers

class MemoController < ApplicationController
 before_action :set_post, only: [:edit, :update, :destroy]

 def index
   @posts = Post.all
 end

 def new
 end

 def create
   Post.create(post_params)
   redirect_to root_path
 end

 def edit
 end

 def update
   @post.update(post_params)
   redirect_to root_path
 end
 
 def destroy
   @post.destroy
   redirect_to root_path
 end

 private
 def post_params
   params.permit(:content)
 end

 def set_post
   @post = Post.find(params[:id])
 end

end

これで投稿した文を削除することができるようになりました。
次回はエラーハンドリング を行いたいと思います。

ここまで読んでいただきありがとうございました。
おかしなコードがあればコメントにお願いします。

この記事が気に入ったらサポートをしてみませんか?