実施環境
ruby "3.1.4"
gem "rails", "~> 7.0.3", ">= 7.0.3.1"
gem "sorcery", "~> 0.16.3"
Gemfileより
エラー内容
ログアウト機能追加の課題実施中、
ログアウトボタンを押すとNo route matches [GET] "/logout"エラーが発生。
エラー画像
エラーログ
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
参考記事