【Rails】destroyアクションの使い方/特定のデータを削除する方法
今回は削除機能を実装していきたいと思います。
削除を行うためにはdestroyアクションを利用するのでしたね。
ルーティングするためにresources に :destroy を追加します。
そして削除ボタンを作成します。
どこに表示させるか、
投稿の一覧ページであれば index.html.erbですね。
ここで一つ一つの投稿ごとに削除できるようにすることが必要なので、
どの投稿を削除するか区別する必要があります。
その場合、投稿のidで区別しましょう。
テーブルと連携させます。
そのために、リンクを作成するためのlink_toメソッドには
このように記述しましょう。
<%= link_to '削除' , post _path (post.id ) , method : : delete %>
肝は完全にこれですね。
post_path ( post.id )
このようなパスにするとパラメーターとして
( post.id )の中身を受け取ることができるのです。
このidはモデル名.idで指定します。
モデルを指定すればどのテーブルから取り出せばいいか分かりますからね。
またこの部分にも注目しましょう。
post_path
これ、パスを指定しているのですが、
URIパターンではなくPrefix を用いています。
これはURIパターンが変数化したもので、rails routesを実行すると確認できます。
実際に確認してみるとdestroyアクションに対応するPrefixは
postとなっているはずです。
そしてPrefixは _path とつけてあげることで
URIパターンのパスとして認識されます。
ではようやくコントローラーにdestroyアクションを定義しましょう。
想像つく範囲として何を記載する必要があるかというと、
・もちろんdestroyメソッドの定義
・どのツイートを削除するのか特定するための記述
こんなところですかね。
それでは記述をみていきましょう。
def destroy
post = Post . find ( params [ : id ] )
post.destroy
end
こうなります。みていきましょう。
まずパラメーターで受け取った( params [ : id ] )を元に
削除するデータをfindメソッドを使って取得します。
findメソッドはモデルで使用できるメソッドなので、モデル名.findとしましょう。
そしてそのデータをdestroyメソッドを使って実際に削除します。
例えば、 post = Post . find ( 3 )
と入力したらpostsテーブルの3番目のデータが削除されます。
なのでルーティングで使用したpost.idと、
コントローラーで使用する params [ : id ] は
同じidが入ります。
idが3であればどちらに入るのも3です。
コントローラーに届く際にはparamsの箱に入れられて届くので
このように示しているだけです。
これで削除機能の実装は完了しました!
あとはビューですね。
削除完了画面があれば完璧です。
destroy.html.erbファイルを編集しましょう。