質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

3回答

1307閲覧

Railsでエラー「No route matches [GET] 」が解決できない

koui8205

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2023/03/11 12:15

実現したいこと

エラー「No route matches [GET] 」を解決して投稿を削除できるようにしたい

前提

開発中のrailsアプリに搭載する投稿記事の削除機能を作っています。
記事を削除後に記事の一覧ページ(growth_diaries/index)に遷移するようにしたいです。
削除するコードを書き、削除用のリンクを設置して押したところ下記のようなエラーメッセージが出て削除できない状態です。
関連するMVCをチェックしましたがどこにもおかしいところが見当たらないため、自分ではわからない状態です。ご教授いただけますと幸いです。

発生している問題・エラーメッセージ

下記のようにルートがないという内容のエラーが出ます。

No route matches [GET] "/growth_diaries/7/destroy"

イメージ説明
イメージ説明

該当のソースコード

config/routes.rb

ruby

1Rails.application.routes.draw do 2 get 'jobs/index' => "jobs#index" 3 get 'jobs/:id' => "jobs#show" 4 get 'farmers/index' 5 get 'users/index' 6 get 'users/new' 7 get 'home/top' 8 get 'growth_diaries/new' => "growth_diaries#new" 9 get 'growth_diaries/index' => "growth_diaries#index" 10 get 'growth_diaries/:id' => "growth_diaries#show" 11 get 'growth_diaries/:id/edit' => "growth_diaries#edit" 12 post 'growth_diaries/:id/update' => "growth_diaries#update" 13 post 'growth_diaries/:id/destroy' => "growth_diaries#destroy" 14 post 'growth_diaries/create' => "growth_diaries#create" 15end

/app/controllers/growth_diaries_controller.rb

ruby

1class GrowthDiariesController < ApplicationController 2 3 def new 4 end 5 6 def create 7 @growth_diary = GrowthDiary.new(title: params[:title], body: params[:body]) 8 @growth_diary.save 9 redirect_to("/growth_diaries/index") 10 end 11 12 def show 13 @growth_diary = GrowthDiary.find_by(id: params[:id]) 14 end 15 16 def index 17 @growth_diaries = GrowthDiary.all.order(created_at: :desc) 18 end 19 20 def edit 21 @growth_diary = GrowthDiary.find_by(id: params[:id]) 22 end 23 24 def update 25 @growth_diary = GrowthDiary.find_by(id: params[:id]) 26 @growth_diary.title = params[:title] 27 @growth_diary.body = params[:body] 28 @growth_diary.save 29 redirect_to("/growth_diaries/index") 30 end 31 32 def destroy 33 @growth_diary = GrowthDiary.find_by(id: params[:id]) 34 @growth_diary.destroy 35 redirect_to("/growth_diaries/index") 36 end 37end

app/views/growth_diaries/show.html.erb

ruby

1<h1><%= @growth_diary.title %></h1> 2<h2><%= @growth_diary.body %></h2> 3<p><%= link_to("編集", "/growth_diaries/#{@growth_diary.id}/edit") %></p> 4<%= link_to("削除", "/growth_diaries/#{@growth_diary.id}/destroy", {method: "post"}) %>

試したこと

参考にしているProgateとも見比べましたが、おかしなところが見当たらない状態です。

  • スペルの確認
  • ルーティングの確認(「スラッシュ」と「#」の打ち間違いがないかなど)

補足情報(FW/ツールのバージョンなど)

Rails 7.0.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuma.inaura

2023/03/11 15:01

postできてなさそうですね getしてしまってる
guest

回答3

0

maisumakun さんも指摘していますが、Rails6 までは rails-ujs が標準だったのが、Rails7 から色々と変わってるので、それが原因かもしれません。

下記の「Turboを使っている場合」の書き方を試してみてはいかがでしょうか?

erb

1<!-- rails-ujsを使っている場合 --> 2<%= link_to("削除", ..., {method: "post"}) %> 3 4<!-- Turboを使っている場合 --> 5<%= link_to("削除", ..., data: {turbo_method: "post"}) %>

投稿2023/03/13 01:54

shinoharat

総合スコア1674

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

このエラーメッセージは、ルーティングが定義されていないため、削除リクエストを処理するためのルートが見つからなかったことを示しています。一般的に、削除機能を実装するためには、HTTPリクエストをDELETEメソッドで送信する必要がありますが、このエラーメッセージはGETリクエストが送信されたことを示しています。

このエラーを解決するためには、削除リクエストを処理するためのルートを定義する必要があります。具体的には、routes.rbファイルに下記のようなルートを定義することで、DELETEリクエストを受け取ることができます。

python

1delete '/growth_diaries/:id', to: 'growth_diaries#destroy', as: 'delete_growth_diary'

このルートは、growth_diariesコントローラーのdestroyアクションを呼び出し、指定されたidのgrowth_diaryレコードを削除します。また、asオプションを使用して、delete_growth_diaryという名前付きルートを定義しています。

そして、削除用のリンクを設置する際には、以下のようにリンクを生成するようにします。

sql

1<%= link_to 'Delete', delete_growth_diary_path(growth_diary), method: :delete, data: { confirm: 'Are you sure?' } %>

このリンクは、delete_growth_diary_pathヘルパーを使用して、delete_growth_diaryルートにDELETEリクエストを送信します。また、methodオプションを使用して、HTTPリクエストをDELETEメソッドに設定し、data-confirmオプションを使用して、削除確認のダイアログを表示します。

これらの変更を行うことで、削除機能が正しく動作し、記事の一覧ページにリダイレクトされるようになるはずです。

投稿2023/03/11 17:06

TateWagon

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参考にしているProgateとも見比べましたが

それは、Rails 7を前提としたものでしょうか。Rails 6と7では、リンクでPOSTを起こすようなJavaScript制御まわりに大きな変化が加わっています。

ProgateがRails 6なら、それに合わせてRails 6で進めることをおすすめします。

投稿2023/03/11 12:51

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問