Bu cevabın orijinal formu çılgınca farklıdır ve burada bulunabilir . Sadece bir kedinin derisini atmanın birden fazla yolu olduğunu kanıtlayın.
Ad alanlarını kullanmak ve varsayılan 302 yerine 301 yönlendirmelerini kullanmak için cevabı güncelledim. Bu şeyleri sormak için pixeltrix ve Bo Jeanes'e teşekkürler.
Gerçekten güçlü bir kask takmak isteyebilirsiniz çünkü bu aklınızı başınızdan alacak .
Rails 3 yönlendirme API'sı çok kötü. API'niz için rotaları yukarıdaki gereksinimlerinize göre yazmak için sadece buna ihtiyacınız vardır:
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
Bu noktadan sonra zihniniz hala sağlamsa, açıklayayım.
İlk olarak, namespace
belirli bir yola ve benzer şekilde adlandırılmış bir modüle sahip bir grup rota istediğinizde süper kullanışlı olanı çağırıyoruz . Bu durumda, blok içindeki tüm rotaların modül namespace
içindeki kontrolörlere dahil edilmesini istiyoruz Api
ve bu rota içindeki yollara yapılan tüm taleplerin önüne ön ek eklenecektir api
. Gibi istekler /api/v2/users
, biliyor musun?
Ad alanının içinde, iki ad alanı daha tanımlıyoruz (woah!). Burada denetleyicileri için tüm yolları içinde olacaktır böylece bu sefer, "v1" ad tanımlarken V1
içeride modül Api
modül: Api::V1
. resources :users
Bu güzergâhın içinde tanımlayarak , kontrolör bulunacaktır Api::V1::UsersController
. Bu sürüm 1, ve gibi istekleri yaparak oraya /api/v1/users
.
Sürüm 2 yalnızca bir minik biraz farklı. Ona hizmet eden denetleyici yerine, Api::V1::UsersController
şu anda Api::V2::UsersController
. Gibi isteklerde bulunarak oraya gelirsiniz /api/v2/users
.
Ardından, a match
kullanılır. Bu, benzer şeylere giden tüm API rotalarıyla eşleşir /api/v3/users
.
Aramam gereken kısım bu. Bu :to =>
seçenek, belirli bir isteğin başka bir yere yönlendirileceğini belirtmenize izin verir - çok şey biliyordum - ancak başka bir yere yönlendirmek ve orijinal isteğin bir parçasını onunla birlikte geçirmek için nasıl bilmediğimi bilmiyordum. .
Bunu yapmak için, redirect
yöntemi çağırır ve özel enterpolasyonlu bir %{path}
parametreye sahip bir dize geçiririz . Bu finalle eşleşen bir istek geldiğinde match
, path
parametreyi %{path}
dizenin içindeki konuma enterpolasyonlar ve kullanıcıyı gitmesi gereken yere yönlendirir.
Son olarak, match
ön ekli kalan tüm yolları /api
yönlendirmek ve yönlendirmek için başka bir yol kullanırız /api/v2/%{path}
. Bu, gibi isteklerin /api/users
gideceği anlamına gelir /api/v2/users
.
Ben nasıl çözemedim /api/asdf/users
buna bir istek olması gerekiyordu olmadığını nasıl belirliyorsunuz, çünkü maç için /api/<resource>/<identifier>
ya /api/<version>/<resource>
?
Her neyse, bu araştırmak eğlenceliydi ve umarım size yardımcı olur!