2019.12.05

【Rails】投稿したデータの削除機能実装手順

ActiveStorageで投稿機能を実装しているのですが、なかなか削除機能をできず解決に時間がかかってしまったので、備忘録としてまとめておきたいと思います。

Viewで画面上に削除リンクを実装

 

views/index.html.erb
<%= link_to '削除', image, method: :delete %>

第一引数はリンクの名称、第二引数はリンク先のパスを指定します。第三引数のmethod: :deleteはHTTPリクエストがDELETEの場合、追記します。$ rake routesでHTTPリクエストを確認できます。

第二引数はHTTPリクエストがDELETEになる場合は、images/:idに対応するデータを指定しなければ僕の場合エラーになりました。images/:idをそのまま第二引数に指定すると下記エラーが発生しました。理由は調査中。

method:  :deleteの部分は:method => :deleteでも意味は同じです。

ControllerにDestroyアクションを追加

controllers/images_controller.rb
def destroy
  @image = Image.find(params[:id]).destroy #Imageから対象のIDを探して削除する
  redirect_to root_url #インデックスページにリダイレクト
end

2行目の意味はfindメソッドdestroyメソッドを繋げて一行にまとめています。findメソッドdestroyメソッドは2行に分けてもどっちでも意味は同じなのでわかりやすいほうでOKです。

 

routes.rbでDestroyアクションを指定

routes.rb
delete '/images/:id' => "images#destroy"

:idは削除ボタンを押下したidがURLに入ります。

imagesコントローラのdestroyアクションを呼び出します。

 

一応解決は出来たが・・・

一応削除機能は実装できたのですが、腑に落ちない点が一つあります。

僕の場合、link_toの第二引数の指定が間違っていたようで、うまくいきませんでした。内容は第二引数に"images/#{:id}"と指定していて対応するidがない的なことを言われ、怒られました。このやり方で最初はいくと思ったんですが、うまくいかず。。どこがおかしいのかいまいち調べても分かりませんでした。DELETE(データの削除)の場合はこの指定だとダメなのかな?

link_toに関する疑問点は分かり次第追記します。わかるよって方がいましたら是非教えてください!

一応その時出たエラー画面をもう一度出しておきます↓