#前提条件
ruby 2.5.1
Rails 5.2.4.4
スクール課題で、Ruby on Rails動画投稿アプリケーション作成中。
#やりたいこと
Devise機能でのログアウト。
#エラー状況
- 下記の様に”ログアウト”設定しました。
<% if user_signed_in? %>
<div class="collapse navbar-collapse" id="Navber">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<%= link_to 'マイページ', user_path, class: "nav-link" %>
</li>
<li class="nav-item">
<%= link_to '新規投稿', new_movie_path, class: "nav-link" %>
</li>
<li class="nav-item">
<%= link_to '投稿一覧', movies_path, class: "nav-link" %>
</li>
<li class="nav-item">
<%= link_to "ログアウト", destroy_user_session_path, method: :delete, class: "nav-link" %>
</li>
</ul>
</div>
- ログアウトすると、残念、エラー!
#やったこと
1. deleteメソッドのルート設定がエラーのよう。rails routesで確認。
destroy_user_session GET /users/sign_out(.:format) devise/sessions#destroy
あれ?メソッドがGETになってる!
**2.**念の為、他のdevise付きアプリのrails routesを参考確認(今度、”サンプル”と呼称します)。
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
DELETEとなってる!
3. なにが違う? routes.rbをチェック!
delete 'tweets/:id' => 'tweets#destroy'
resource :user, except: [:new, :create, :destroy]
...。
サンプルはdeleteで記述。
作成中のコードはresourceメソッドを使用。
かつ、except:[:destroy]????
4. まずexcept:[:destroy]のdestroy消去。
resource :user, except: [:new, :create]
が、ログアウトすると同じエラー。
5. ならば下記を追加! resourseとダブルと思うけど...。
delete 'users/:id' =>'users#destroy'
6. エラーが変わった!1行だけのエラー。
7. エラーいわく:”UsersControllerのためのdestroy actionが見つけられない。”
下記追記し、**解決(エラーでずログアウト後にトップ画面へ!)**しました!
*Ruby on Rails チュートリアル 第8章3項 ”ログアウト”参照させていただきました。
def destroy
session.delete(:user_id)
@current_user = nil
redirect_to root_url
8. 念の為、rails routes 確認。
destroy_user_session GET /users/sign_out(.:format) devise/sessions#destroy
ん〜。
やはりメソッドはGETのままでした。
もやもや感はありますが、エラーは出ないので解決とさせていただきます。
どなたかこの点(GETでもログアウトできるのはなぜか?)を教えていただける方がいればありがたいです!!
#まとめ
間違っていた(完全勘違い)こと:
- userをdestroyする必要がない、と思い resource :user, except: [:new, :create, :destroy]とした。実際にはログアウト時にsessionsからのdestroyが必要。
学び:
- resourceを使用し、アクション明記する場合は、コントローラーとの組み合わせに注意する。
- アクションの記載漏れに注意。
参考:*Ruby on Rails チュートリアル 第8章3項 ”ログアウト”
以上になります!
エラー解決の一助になれば嬉しいです!