状況
Rails6でdeviseを使用していると、以下のようなエラーが表示されログアウトができなくなることがある。
Couldn't find User with 'id' = sign_out
このエラーに掛かっている人はおそらく、ログアウトのメソッドとして以下のようにDELETEを指定しているだろう。
<%= link_to'ログアウト', destroy_user_session_path, method: :delete %>
しかし、DELETEを指定していてもメソッドがGETになってしまうことがあるようだ。(この点の詳細は私には分かりかねるので別の情報をご参照いただきたい。)
対処法には大きく以下の二つがある。
対処法① ルーティングを設定する
ルーティングを以下のように設定し、GETリクエストをdestroy Actionへ渡す。
devise_scope :user do
get '/users/sign_out' => 'devise/sessions#destroy'
end
これでGETメソッドで取得されたリクエストをDLETEに変換することができる。
対処法② deviseの設定を変える
devise.rbの設定を以下のように、:deleteから:getに変更。(デフォルトだと272行目あたり)
config.sign_out_via = :get
これを変更した後、サーバーを立て直す必要がある。ローカルでサーバーを立てている場合はrails s
を、docker環境の場合はコンテナをビルドし直す必要がある。
これで、getメソッドによるログアウトが可能になる。
所感
関連する記事をいくつか確認したが、このようにある日突然、同じコードで同じ処理ができなくなるというのは、やはりなんか気持ち悪い。このようなエラーは自力で原因が分かりづらいので、ここに記すことで微力ながらどなたかの解決の一助となればと思う。
参考