이 답변의 원래 형식은 크게 다르며 여기에서 찾을 수 있습니다 . 고양이를 피부에 바르는 방법이 두 가지 이상 있다는 것을 증명하십시오.
네임 스페이스를 사용하고 기본값 302 대신 301 리디렉션을 사용하기 때문에 답변을 업데이트했습니다.
당신은 당신의 마음 을 날려 버릴 것이기 때문에 당신은 정말 강한 헬멧 을 착용하고 싶을 수도 있습니다 .
Rails 3 라우팅 API는 매우 사악합니다. 위의 요구 사항에 따라 API 경로를 작성하려면 다음이 필요합니다.
namespace :api do
namespace :v1 do
resources :users
end
namespace :v2 do
resources :users
end
match 'v:api/*path', :to => redirect("/api/v2/%{path}")
match '*path', :to => redirect("/api/v2/%{path}")
end
이 시점 이후에도 여전히 마음이 손상되지 않았다면 설명하겠습니다.
먼저, 우리 namespace
는 비슷한 경로를 가진 특정 경로와 모듈의 범위를 원할 때 매우 편리한 호출이라고 부릅니다 . 이 경우 블록 namespace
내의 Api
모든 경로를 모듈 내의 컨트롤러로 범위 지정 하고이 경로 내의 경로에 대한 모든 요청 앞에 접두사가 붙습니다 api
. 와 같은 요청을 /api/v2/users
알고 있습니까?
네임 스페이스 내에서 두 개의 네임 스페이스를 더 정의합니다 (woah!). 이번에는 "v1"네임 스페이스를 정의하고 있으므로 여기서 컨트롤러의 모든 경로는 V1
모듈 내부의 Api
모듈 내부에 Api::V1
있습니다. resources :users
이 경로 내부 를 정의 하면 컨트롤러가에 위치 Api::V1::UsersController
합니다. 이것은 버전 1이며 다음과 같이 요청하여 도착합니다 /api/v1/users
.
버전 2 만 인 작은 비트 다른. 에 서비스를 제공하는 컨트롤러 대신 Api::V1::UsersController
현재 위치에 Api::V2::UsersController
있습니다. 와 같은 요청을 통해 도착합니다 /api/v2/users
.
다음으로 a match
가 사용됩니다. 이것은와 같은 모든 API 경로와 일치합니다 /api/v3/users
.
이것은 내가 찾아야 할 부분입니다. 이 :to =>
옵션을 사용하면 특정 요청을 다른 곳으로 리디렉션해야한다고 지정할 수 있습니다. .
이를 위해 redirect
메소드를 호출하고 특수 보간 %{path}
매개 변수가 있는 문자열을 전달합니다 . 이 final과 일치하는 요청이 들어 오면 매개 변수를 문자열 내부의 위치로 match
보간 하고 사용자를 필요한 곳으로 리디렉션합니다.path
%{path}
마지막으로 다른 match
경로를 사용하여 접두사가있는 나머지 모든 경로를 라우팅 /api
하고로 리디렉션합니다 /api/v2/%{path}
. 이는와 같은 요청 /api/users
이로 이동 함을 의미합니다 /api/v2/users
.
내가 얻는 방법을 알아낼 수없는 /api/asdf/users
그가에 요청 있어야하는 경우 당신은 어떻게 결정 않기 때문에, 일치 /api/<resource>/<identifier>
또는 /api/<version>/<resource>
?
어쨌든, 이것은 연구하기에 재미 있었고 나는 그것이 당신에게 도움이되기를 바랍니다!