Rubbyon Rails [오류 메모] Routing Error No route matches "/users/sign out"

6041 단어 RubyRails

전제 조건


ruby 2.5.1
Rails 5.2.4.4
학교 과제에서는 루비 온 레일스 애니메이션 투고 앱을 제작하고 있다.

하고 싶은 일


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) 로그아웃하면 유감입니다, 오류!

해본 일


1. delete 메서드의 루트 설정이 잘못되었을 수 있습니다.rails routes를 통해 확인합니다.
rails routes
destroy_user_session GET /users/sign_out(.:format) devise/sessions#destroy                                          
어?방법은 GET!
만일의 경우를 대비하여 다른 devise가 적용된 rails routes(다음에는'샘플'이라고 함)를 참고하여 확인한다.
rails routes(샘플)

 destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy                                                               
데레트가 되어라!
3.뭐가 달라요?routes.rb 검사!
routes.rb(샘플)
delete  'tweets/:id'  => 'tweets#destroy'
routes.rb(제작 중인 코드)
 resource :user, except: [:new, :create, :destroy]
....
견본은 delete로 설명합니다.
제작 중인 코드는 Resource 방법을 사용합니다.
좋아, 좋아, 나쁘다, 나쁘다, 나쁘다, 나쁘다???
4. 먼저 except: [:destroy]의 destroy를 삭제합니다.
오류 routes.rb
 resource :user, except: [:new, :create]
그러나 로그아웃하는 동안 오류가 발생했습니다.

5. 그럼 다음 내용을 추가!저는 리소스랑 이중인 것 같아요...
오류 routes.rb
 delete 'users/:id' =>'users#destroy'
6. 잘못이 바뀌었다!한 줄의 오류입니다.

7. 오류: "UsersController의 destroy action을 찾을 수 없습니다."
다음 내용을 보충하여 해결(오류가 아니라 로그아웃 후 옥상 화면으로 들어갑니다!)했어!
● 루비 온 레일스 튜토리얼 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항 "로그아웃"
    이상은!
    만약 잘못을 해결하는 데 도움을 줄 수 있다면 나는 매우 기쁠 것이다.

    좋은 웹페이지 즐겨찾기