LoginSignup
1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-13

前提条件

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

やりたいこと

Devise機能でのログアウト

エラー状況

1) 下記の様に”ログアウト”設定しました。

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

やったこと

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

rails routes
destroy_user_session GET /users/sign_out(.:format) devise/sessions#destroy                                          

あれ?メソッドがGETになってる!

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

rails routes(サンプル)

 destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy                                                               

DELETEとなってる!

3. なにが違う? routes.rbをチェック!

routes.rb(サンプル)
delete  'tweets/:id'  => 'tweets#destroy'
routes.rb(作成中のコード)
 resource :user, except: [:new, :create, :destroy]

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

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

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

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

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

image.png

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

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

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

image.png

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

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

app/controllers/users_controller.rb
 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項 ”ログアウト”

以上になります!

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

1
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
1
0