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, namespacebelirli 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 namespaceiçindeki kontrolörlere dahil edilmesini istiyoruz Apive 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 V1içeride modül Apimodül: Api::V1. resources :usersBu 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 matchkullanı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, redirectyö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, pathparametreyi %{path}dizenin içindeki konuma enterpolasyonlar ve kullanıcıyı gitmesi gereken yere yönlendirir.
Son olarak, matchön ekli kalan tüm yolları /apiyönlendirmek ve yönlendirmek için başka bir yol kullanırız /api/v2/%{path}. Bu, gibi isteklerin /api/usersgideceği anlamına gelir /api/v2/users.
Ben nasıl çözemedim /api/asdf/usersbuna 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!