Các hình thức ban đầu của câu trả lời này là rất khác nhau, và có thể được tìm thấy ở đây . Chỉ cần chứng minh rằng có nhiều hơn một cách để lột da một con mèo.
Tôi đã cập nhật câu trả lời kể từ khi sử dụng không gian tên và sử dụng chuyển hướng 301 - thay vì mặc định là 302. Cảm ơn pixeltrix và Bo Jeanes đã nhắc nhở về những điều đó.
Bạn có thể muốn đội một chiếc mũ bảo hiểm thực sự mạnh mẽ bởi vì điều này sẽ thổi bay tâm trí của bạn .
API định tuyến Rails 3 siêu độc ác. Để viết các tuyến đường cho API của bạn, theo yêu cầu của bạn ở trên, bạn chỉ cần điều này:
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
Nếu tâm trí của bạn vẫn còn nguyên vẹn sau thời điểm này, hãy để tôi giải thích.
Đầu tiên, chúng tôi gọi namespace
đó là siêu tiện dụng khi bạn muốn một loạt các tuyến đường nằm trong một đường dẫn và mô-đun cụ thể có tên tương tự. Trong trường hợp này, chúng tôi muốn tất cả các tuyến đường trong khối để chúng tôi namespace
được đặt trong phạm vi các bộ điều khiển trong Api
mô-đun và tất cả các yêu cầu đối với các đường dẫn bên trong tuyến đường này sẽ được bắt đầu bằng api
. Yêu cầu như /api/v2/users
, bạn biết không?
Trong không gian tên, chúng tôi xác định thêm hai không gian tên (woah!). Lần này chúng ta sẽ xác định không gian tên "v1", vì vậy tất cả các tuyến cho bộ điều khiển ở đây sẽ nằm trong V1
mô-đun bên trong Api
mô-đun : Api::V1
. Bằng cách xác định resources :users
bên trong tuyến đường này, bộ điều khiển sẽ được đặt tại Api::V1::UsersController
. Đây là phiên bản 1 và bạn đến đó bằng cách thực hiện các yêu cầu như thế nào /api/v1/users
.
Phiên bản 2 chỉ là một nhỏ chút khác nhau. Thay vì bộ điều khiển phục vụ nó đang ở Api::V1::UsersController
, bây giờ nó ở Api::V2::UsersController
. Bạn đến đó bằng cách thực hiện các yêu cầu như thế nào /api/v2/users
.
Tiếp theo, a match
được sử dụng. Điều này sẽ phù hợp với tất cả các tuyến API đi đến những thứ như /api/v3/users
.
Đây là phần tôi đã phải tìm kiếm. Các :to =>
tùy chọn cho phép bạn xác định rằng một yêu cầu cụ thể nên được chuyển hướng ở một nơi khác - Tôi biết rằng có rất nhiều - nhưng tôi không biết làm thế nào để có được nó để chuyển hướng đến một nơi khác và vượt qua trong một mảnh yêu cầu ban đầu cùng với nó .
Để làm điều này, chúng ta gọi redirect
phương thức và truyền cho nó một chuỗi với %{path}
tham số được nội suy đặc biệt . Khi một yêu cầu xuất hiện phù hợp với trận chung kết này match
, nó sẽ nội suy path
tham số vào vị trí %{path}
bên trong chuỗi và chuyển hướng người dùng đến nơi họ cần đến.
Cuối cùng, chúng tôi sử dụng một cái khác match
để định tuyến tất cả các đường dẫn còn lại có tiền tố /api
và chuyển hướng chúng đến /api/v2/%{path}
. Điều này có nghĩa là yêu cầu như /api/users
sẽ đi đến /api/v2/users
.
Tôi không thể tìm ra làm thế nào để /api/asdf/users
khớp, bởi vì làm thế nào để bạn xác định xem đó có phải là một yêu cầu /api/<resource>/<identifier>
hay /api/<version>/<resource>
không?
Dù sao, đây là niềm vui để nghiên cứu và tôi hy vọng nó sẽ giúp bạn!