【초학자용】Rails의 라우팅에 있어서 HTTP 리퀘스트의 설정으로 조심하는 점

4046 단어 루비Rails5
Rails를 사용한 애플리케이션 개발에서 routes 파일의 라우팅 설정에 주의하고 싶은 점을 잊지 않도록 기사를 작성해 보았습니다. 첫 투고 및 초학자 때문에 표현이나 해석에 실수가 있을지도 모릅니다만 용서해 주십시오.

발생한 오류



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.rb
class 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의 계층이 같고 상위의 계층명이 같은 경우는 계층명이나 기술하는 순서에 주의하는 것으로 에러의 예방이나 해소에 연결될 것 같습니다.

좋은 웹페이지 즐겨찾기