Ruby on Rails 【エラー備忘録】Routing Error No route matches [DELETE] "/users/sign_out"


#前提条件
ruby 2.5.1 
Rails 5.2.4.4
スクール課題で、Ruby on Rails動画投稿アプリケーション作成中。

#やりたいこと
Devise機能での**ログアウト**。

#エラー状況
 1) 下記の様に”ログアウト”設定しました。

```ruby:app/views/layouts/application.html/erb

 <% 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>
```

2) ログアウトすると、残念、エラー！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609621/b9f697b6-3862-6335-1a43-e42a023ca86c.png)

#やったこと

**1.** deleteメソッドのルート設定がエラーのよう。rails routesで確認。

```ruby:rails&nbsp;routes
destroy_user_session GET /users/sign_out(.:format) devise/sessions#destroy                                          
```
 あれ？メソッドが**GET**になってる！

**2.**念の為、他のdevise付きアプリのrails routesを参考確認（今度、”サンプル”と呼称します）。

```ruby:rails&nbsp;routes(サンプル)

 destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy                                                               
```
**DELETE**となってる！

**3.** なにが違う？ routes.rbをチェック！

```ruby:routes.rb(サンプル)
delete  'tweets/:id'  => 'tweets#destroy'
```


```ruby:routes.rb（作成中のコード）
 resource :user, except: [:new, :create, :destroy]
```

...。
サンプルはdeleteで記述。

作成中のコードはresourceメソッドを使用。
かつ、except:[:**destroy**]???? 

**4.** まずexcept:[:**destroy**]のdestroy消去。

```ruby:エラーroutes.rb
 resource :user, except: [:new, :create]
```

が、ログアウトすると同じエラー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609621/35d54c99-1046-7ced-b8da-9bd387bb720e.png)

**5.** ならば下記を追加！ resourseとダブルと思うけど...。

```ruby:エラーroutes.rb
 delete 'users/:id' =>'users#destroy'
```

**6.** エラーが変わった！1行だけのエラー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609621/88498a48-0867-2cb6-b1c9-b288be4649dc.png)

**７.** エラーいわく：”UsersControllerのためのdestroy actionが見つけられない。” 
下記追記し、**解決（エラーでずログアウト後にトップ画面へ！）**しました！

＊Ruby on Rails チュートリアル 第８章３項 ”ログアウト”参照させていただきました。

https://railstutorial.jp/chapters/log_in_log_out?version=4.2#sec-logging_out

```ruby:app/controllers/users_controller.rb
 def destroy
        session.delete(:user_id)
        @current_user = nil
        redirect_to root_url
```

**8.** 念の為、rails routes 確認。

```ruby：
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 チュートリアル 第８章３項 ”ログアウト”

https://railstutorial.jp/chapters/log_in_log_out?version=4.2#sec-logging_out

以上になります！

エラー解決の一助になれば嬉しいです！