0
0

More than 1 year has passed since last update.

ログアウト実行でNo route matches [GET] "/logout"エラー 解決方法

Posted at

実施環境

ruby "3.1.4"
gem "rails", "~> 7.0.3", ">= 7.0.3.1"
gem "sorcery", "~> 0.16.3"
Gemfileより

エラー内容

ログアウト機能追加の課題実施中、
ログアウトボタンを押すとNo route matches [GET] "/logout"エラーが発生。

エラー画像

スクリーンショット 2023-07-14 10.59.05.png

エラーログ

Started GET "/logout" for 172.20.0.1 at 2023-07-14 10:58:08 +0900
Cannot render console from 172.20.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1
ActionController::RoutingError (No route matches [GET] "/logout"):

routs.rbでもちゃんとDELETEで指定しているし、html.erbでもmethod:deleteなのに、
getになってしまった。

現状のコード

routs.rb
Rails.application.routes.draw do

  get '/login', to: 'user_sessions#new'
  post '/login', to: 'user_sessions#create'
  delete '/logout', to: 'user_sessions#destroy'
end
_header.html.erb
<%= link_to 'ログアウト', logout_path, class: 'dropdown-item', method: :delete } %>
user_sessions_controller.rb
  def destroy
    logout
    redirect_to root_path
  end

解決

伊藤さんのQiitaに解決策がありました。

1:turboを使っている場合、link_toメソッドのmethod:オプションの書き方が変わった
2:destroyアクションのレスポンスには必ず status: :see_other を付ける必要がある

Rails 7.0でTurboはデフォルト導入されるそうでリンクでdata-turbo-method属性を使うことで、GET以外のHTTPメソッドを指定できるとのこと。

上記を踏まえて、ソースコードを修正したところ、ログアウト実行がうまくいきました。

修正したコード

_header.html.erb
<%= link_to 'ログアウト', logout_path, class: 'dropdown-item', data: { turbo_method: :delete } %>
user_sessions_controller.rb
  def destroy
    logout
    rredirect_to root_path, status: :see_other
  end

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0