Die ursprüngliche Form dieser Antwort ist völlig anders und kann hier gefunden werden . Nur ein Beweis dafür, dass es mehr als einen Weg gibt, eine Katze zu häuten.
Ich habe die Antwort seitdem aktualisiert, um Namespaces zu verwenden und 301-Weiterleitungen zu verwenden - anstelle der Standardeinstellung 302. Vielen Dank an Pixeltrix und Bo Jeanes für die Aufforderung zu diesen Dingen.
Vielleicht möchten Sie einen wirklich starken Helm tragen, da dies Sie umhauen wird .
Die Rails 3-Routing-API ist super böse. Um die Routen für Ihre API gemäß Ihren obigen Anforderungen zu schreiben, benötigen Sie genau Folgendes:
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
Wenn Ihr Geist nach diesem Punkt noch intakt ist, lassen Sie mich das erklären.
Zunächst rufen wir an, namespace
was sehr praktisch ist, wenn Sie eine Reihe von Routen für einen bestimmten Pfad und ein bestimmtes Modul mit ähnlichen Namen wünschen. In diesem Fall möchten wir, dass alle Routen innerhalb des Blocks für namespace
Controller innerhalb des Api
Moduls festgelegt werden und allen Anforderungen an Pfade innerhalb dieser Route ein Präfix vorangestellt wird api
. Anfragen wie /api/v2/users
, weißt du?
Innerhalb des Namespace definieren wir zwei weitere Namespaces (woah!). Dieses Mal definieren wir den Namespace "v1", sodass sich alle Routen für die Controller hier innerhalb des V1
Moduls innerhalb des Api
Moduls befinden : Api::V1
. Durch die Definition resources :users
innerhalb dieser Route befindet sich der Controller unter Api::V1::UsersController
. Dies ist Version 1, und Sie gelangen dorthin, indem Sie Anfragen wie stellen /api/v1/users
.
Version 2 ist nur ein kleines bisschen anders. Anstelle des Controllers, der es bedient, Api::V1::UsersController
ist es jetzt bei Api::V2::UsersController
. Sie gelangen dorthin, indem Sie Anfragen wie stellen /api/v2/users
.
Als nächstes wird a match
verwendet. Dies entspricht allen API-Routen, die zu Dingen wie gehen /api/v3/users
.
Dies ist der Teil, den ich nachschlagen musste. Mit dieser :to =>
Option können Sie festlegen, dass eine bestimmte Anforderung an eine andere Stelle umgeleitet werden soll - das wusste ich -, aber ich wusste nicht, wie ich sie an eine andere Stelle umleiten und einen Teil der ursprünglichen Anforderung zusammen mit dieser weiterleiten kann .
Dazu rufen wir die redirect
Methode auf und übergeben ihr einen String mit einem speziell interpolierten %{path}
Parameter. Wenn eine Anforderung eingeht, die diesem Finale entspricht match
, interpoliert sie den path
Parameter in die Position %{path}
innerhalb der Zeichenfolge und leitet den Benutzer dorthin weiter, wo er hin muss.
Schließlich verwenden wir einen anderen match
, um alle verbleibenden Pfade, denen das Präfix vorangestellt ist, weiterzuleiten /api
und an diese umzuleiten /api/v2/%{path}
. Dies bedeutet, dass Anfragen wie /api/users
an gehen /api/v2/users
.
Ich konnte nicht herausfinden, wie ich /api/asdf/users
zum Match kommen kann, denn wie bestimmen Sie, ob dies eine Anfrage an /api/<resource>/<identifier>
oder sein soll /api/<version>/<resource>
?
Wie auch immer, es hat Spaß gemacht zu recherchieren und ich hoffe es hilft dir!