データを削除できるようにした

はじめに

現状のRailsポートフォリオアプリケーションでは、登録して表示させたデータを削除することができない。

削除できるようにしていこう。

現状の一覧ページ(ローカル)

この登録したデータを削除したい。

http://localhost:3000/posts/index

削除ボタンを追加

まずは、以下を参考にして、削除ボタンを追加する。

Rails 削除機能の実装方法 手順 #Ruby – Qiita

8行目を追記した。

app/views/posts/index.html.erb

削除ボタンが追加された。

削除ボタンを押すと

ジャンカラのほうの削除ボタンを押すと、以下の画面に遷移した。

http://localhost:3000/posts/2

Routing Errorだ。

ルーティングを設定してもルーティングエラーが解消されない

こちらを参考にして、削除のルーティングを設定する。

Rails 削除機能の実装方法 手順 #Ruby – Qiita

以下の7行目のように書いてもエラーは解消されなかった。

config/routes.rb

ルーティングのresourcesにdestroyを追加してみる

以下を参考にして、resources :posts, only: [:destroy]を追加してみよう。

【初心者用】Ruby on Railsの勉強【ツイートの削除機能の実装】 | 運動器 学ぶろぐ
config/routes.rb

何も変わらなかった。

詳細ページへのルーティングを追加する

先ほどのエラーをもう一度確認しよう。

http://localhost:3000/posts/2

詳細画面へのルーティングを設定すれば、とりあえずこのエラーは解消するだろう。

まずは、以下を参考にする。

3-13. 詳細ページを表示しよう #Ruby – Qiita

9行目を追加した。8行目は、URLが同じだが、postなので残しておこう。

config/routes.rb

これで画面のリロードをかけると、先ほどのエラーとは別のエラーが発生した。

これは、ケアレスミスだ。

http://localhost:3000/posts/2

アクションの前に/を書いてしまっていたので、#に修正した。

再び、リロードをかけると、分かりやすいエラーが発生した。

http://localhost:3000/posts/2

詳細ページのアクションを作成する

showアクションがないことが原因のエラー。

追加した。

app/controllers/posts_controller.rb

画面をリロードすると、テンプレートファイルがない時に発生するエラーが顔を出した。

http://localhost:3000/posts/2

詳細ページのテンプレートファイルを作成する

app > views > postsにアクション名が含まれるerbファイルを新規作成した。

app/views/posts/show.html.erb

ブラウザをリロードすると、エラーが解消されて、詳細ページが表示された。

http://localhost:3000/posts/2

現状、削除ボタンを押すと詳細ページに飛ぶ

削除ボタンをクリックすると、詳細ページに飛んでしまう。

http://localhost:3000/posts/index

以下のソースコードを書いているからだろう。

app/views/posts/index.html.erb

削除の記述を行い、削除できるかどうか試してみる

methodは、deleteにした。

app/views/posts/index.html.erb

ルーティングの最初にも、deleteと書いた。

config/routes.rb

コントローラーには、destroyアクションを追加した。

app/controllers/posts_controller.rb

削除ボタンを押しても、先ほどと同じく、詳細ページに飛んだ。

以下のルーティングが呼ばれているからだろう。

resourcesの記述を削除してみる

2行目に追加していた以下の記述を削除してみる。

それでも挙動に変化はなかった。

基本に立ち返る

Rails 削除機能の実装方法 手順 #Ruby – Qiitaを参考にして、ビュー、コントローラ、ルーティングを一つ一つ進めていこう。

焦らず、ゆっくりと。

まずは、削除ボタンを作成する。

Rails 削除機能の実装方法 手順 #Ruby – Qiita

ビューファイルを以下のように変更した。

app/views/posts/index.html.erb

次に、ルーティングを設定しよう。

Rails 削除機能の実装方法 手順 #Ruby – Qiita

以下のように、ルーティングファイルを変更した。

config/routes.rb

そして、コントローラ。以下の例では、if文で、ログインユーザかどうかを確認している。今回は、deviseを導入した会員登録機能を実装していないので、この記述は書かない。

Rails 削除機能の実装方法 手順 #Ruby – Qiita

destroyアクションに以下を追記した。Postテーブルから現在のパラメータの値を見つけて、@postというインスタンス変数に入れたのが19行目。20行目では、@postに対して、destroyアクションを使用した。

最後に、削除完了後に遷移するページを作成していく。

Rails 削除機能の実装方法 手順 #Ruby – Qiita

postsディレクトリに、destroy.html.erbを新規作成した。

app/views/posts/destroy.html.erb

果たして、これで削除できるのか?

それでも上手くいかない

一覧ページの削除ボタンを押しても、詳細ページに飛ばされてしまう。

ログはこちら。

現在の処理の流れを追ってみる

現在の処理の流れを追ってみよう。

link_toメソッドで、削除ボタンが生成されている。

app/views/posts/index.html.erb

生成された2つ目の投稿のHTMLはこちら。

chromeの要素の検証で確認

data-method属性はdeleteなので、削除のリンクとして申し分ないように思える。

なぜ詳細ページに飛んでしまうのか?

それ以降に問題があるのでは?

次のステップは、ルーティング。

と、順番に見ていこうと思ったが、救世主となる記事を検索することに成功した。

上手く削除できた

1年以内でフィルタリングをかけて、以下のキーワードでググった。

method: :deleteという書き方は、最近のRailsでは機能しないようだ。data: { turbo_method: : delete }という書き方に変更する必要があるみたい。

【エラー】削除ボタンを押しても削除されない!?|ono

変更した。

app/views/posts/index.html.erb

削除ボタンを押すと、無事に、2つ目の投稿が削除された。

http://localhost:3000/posts/index

要素の検証で確認すると、data-turbo-methodという属性がついていた。

要素の検証で確認

ひとまず、投稿を削除することができてよかった。

本番でも削除を試そう

gitにソースコードをアップして、手動デプロイを行った。

現状は、以下のように、データが5つある。

https://money-app-khiro-a414f54be759.herokuapp.com/posts/index

サウナを削除できるかどうか試してみよう。

1500の右にある削除を押すと、無事に削除することができた。

https://money-app-khiro-a414f54be759.herokuapp.com/posts/index

本当に削除してもよろしいですか?という確認メッセージは欲しいところだ。

次回以降、実装していく。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

投稿ID : 24551