(4)Railsで簡単なメモアプリを作ってみる
前回の作業で編集フォームと一覧表示が作成できました。
投稿 → (3)Railsで簡単なメモアプリを作ってみる
今回は削除機能を追加していきます。
destroyアクションの追加
config/routes.rb
resources :memo, only: [:new, :create, :edit, :update, :destroy]
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と同じなんです。
あれ?何も書いてないじゃ無いか!
これ実は省略されているだけで、全部memo_pathなんです。
僕は最初わからずPath(/memo/:id)使っていました。(汗
・method:method: :delete
ここでmethodを指定するとdestroyアクションが起動します。
ブラウザで確認すると削除機能が使えるようになりました。
http://localhost:3000/
リファクタリング
機能実装がある程度終わったら可読性を上げるために
同じような記述をひとまとめにしていきます。
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
これで投稿した文を削除することができるようになりました。
次回はエラーハンドリング を行いたいと思います。
ここまで読んでいただきありがとうございました。
おかしなコードがあればコメントにお願いします。
この記事が気に入ったらサポートをしてみませんか?