ルーティング
posts
についてはresources
で設定したため、削除用のルーティングも自動生成されている。
- DELETEメソッド
- URLは
"/posts/:id"
- コントローラーとアクションは
posts#destroy
- Prefixは
post
(post_path
)
1 2 3 4 5 6 7 8 9 10 11 |
[vagrant@vagrant ex_bbs]$ rails routes Prefix Verb URI Pattern Controller#Action ..... posts GET /posts(.:format) posts#index POST /posts(.:format) posts#create new_post GET /posts/new(.:format) posts#new edit_post GET /posts/:id/edit(.:format) posts#edit post GET /posts/:id(.:format) posts#show PATCH /posts/:id(.:format) posts#update PUT /posts/:id(.:format) posts#update DELETE /posts/:id(.:format) posts#destroy |
ビュー
トップの投稿一覧中、削除アイコンのリンク先を設定する。
/posts/:id → post_path(post)
また、メソッドをdelete
で指定する。
top.html.erb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<div class="top_page"> ..... <% if @posts.any? %> <div class="posts"> <% @posts.each do |post| %> ..... <ul class="post_menu"> ..... <li> <%= link_to(post_path(post), method: :delete, class: "#{menu_availability}") do %> <i class="fas fa-trash-alt", title="記事削除"></i> <% end %> </li> </ul> ..... <% end %> </div> ..... <% end %> </main> |
posts#destroyアクション
destroy
アクションにデータの削除処理を記述。
params[:id]
でURLパラメータの:id
を取得- このidを使ってデータベースから
Post
データを取得 Post
データ→PostImage
データから画像ファイルのパスを取得してファイルを削除- 取得した
Post
データをdestroy
(Post
とそれに従属するPostImages
が連動して削除される)
なお、ブラウザー側でpointer-events
が効かない場合も考慮して、DBから取得したPost
のuser_id
とセッション中のユーザーのidが一致する場合のみ削除している。
また、画像ファイルのフルパスを得るためのヘルパーを別に準備している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class PostsController < ApplicationController ..... def destroy # SCSSのpointer-events: noneが効かないときの対策 if post.user_id = user_in_session.id # パラメーターのidから削除するpostオブジェクトを取得 post = Post.find(params[:id]) # postオブジェクトのpost_idから削除するpost_imageオブジェクトを取得 post_image = PostImage.find_by(post_id: post.id) # post_helper.rbのヘルパーで画像ファイルのフルパスを取得 file_path = post_image_path(post_image) # 画像ファイルの削除 File.delete(file_path) # データベースからpostデータを削除 post.destroy end redirect_to top_path and return end ..... end |
post_image_pathヘルパー
画像ファイルのオブジェクトpost_image
を与えて画像ファイルのフルパスを返すヘルパー。
もう一つのpost_image_url
はビューで使用するもので、それぞれパスの表現が違う。
1 2 3 4 5 6 7 8 9 10 11 |
module PostsHelper ..... # post_imageオブジェクトを与えてファイルのフルパスを返すヘルパー # コントローラー用 def post_image_path(post_image) upload_dir = Rails.root.join("public", "post_images") file_path = upload_dir + post_image.file_name end end |