【초학자용】Rails의 라우팅에 있어서 HTTP 리퀘스트의 설정으로 조심하는 점
발생한 오류
ActiveRecord::RecordNotFound in UsersController
Rails의 config/routes.rb 파일에서 라우팅을 설정하여 지정한 URL에 액세스할 수 없는 오류가 발생했습니다.
이때 routes 파일과 컨트롤러는 다음과 같이 설정했습니다.
config/routes.rb # usersコントローラ
get "users/:id" => "users#show", as: "user"
get "users/close" => "users#complete"
users_controller.rbclass UsersController < ApplicationController
def show
@user = EndUser.find(params[:id])
end
def complete
end
end
이번에는 EndUser라는 모델을 준비하고 있습니다.
이 상태에서 브라우저에서 URL로
http://localhost:3000/users/close
입력하면 아래와 같은 오류가 발생했습니다.
routes 파일에 기술한 HTTP 리퀘스트가 위의 행으로부터 적용되는 것으로, users/close의 URL상에서 users/:id의 리퀘스트가 먼저 적용되어 users 컨트롤러의 show 액션이 불려 갑니다. :id 부분에 URL로 입력한 users/close의 close라는 문자열이 대입되어 있습니다. 이로 인해 show 액션에서 설정한 인스턴스 변수에 EndUser 테이블 안에서 id에 "close"라는 문자열이 있는 존재하지 않는 레코드를 찾아서 전달하려고 했기 때문이었습니다.
config/routes.rb # usersコントローラ
get "users/:id" => "users#show", as: "user" #こっちから実行されるため
get "users/close" => "users#complete" #これが実行されていない
해결책
그래서 다음과 같이 라우팅 순서를 다시 설정했습니다.
config/routes.rb # usersコントローラ
get "users/close" => "users#complete"
get "users/:id" => "users#show", as: "user"
complete 액션에 대응하는 view 파일은 다음과 같이 설정합니다.
users/complete.html.erb<h1>退会が完了しました</h1>
다시 로컬 서버에서 users/close를 입력하면 위의 get "users/close"요청이 먼저 실행되어 다음과 같이 URL에 올바르게 액세스 할 수있었습니다.
요약
routes 파일에서 url을 설정할 때,
users/close
users/:id
와 같이 URL의 계층이 같고 상위의 계층명이 같은 경우는 계층명이나 기술하는 순서에 주의하는 것으로 에러의 예방이나 해소에 연결될 것 같습니다.
Reference
이 문제에 관하여(【초학자용】Rails의 라우팅에 있어서 HTTP 리퀘스트의 설정으로 조심하는 점), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Hippymou5/items/ddf51445d423a7ec4870
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# usersコントローラ
get "users/:id" => "users#show", as: "user"
get "users/close" => "users#complete"
class UsersController < ApplicationController
def show
@user = EndUser.find(params[:id])
end
def complete
end
end
# usersコントローラ
get "users/:id" => "users#show", as: "user" #こっちから実行されるため
get "users/close" => "users#complete" #これが実行されていない
# usersコントローラ
get "users/close" => "users#complete"
get "users/:id" => "users#show", as: "user"
<h1>退会が完了しました</h1>
routes 파일에서 url을 설정할 때,
users/close
users/:id
와 같이 URL의 계층이 같고 상위의 계층명이 같은 경우는 계층명이나 기술하는 순서에 주의하는 것으로 에러의 예방이나 해소에 연결될 것 같습니다.
Reference
이 문제에 관하여(【초학자용】Rails의 라우팅에 있어서 HTTP 리퀘스트의 설정으로 조심하는 점), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Hippymou5/items/ddf51445d423a7ec4870텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)