この回答の元の形式は大きく異なり、ここで見つけることができます。猫の皮をむく方法は複数あることを証明してください。
名前空間を使用し、デフォルトの302ではなく301リダイレクトを使用するようにしてから、回答を更新しました。これらについてのプロンプトを提供してくれたpixeltrixとBo Jeanesに感謝します。
これはあなたの心を爆破するので、あなたは本当に強いヘルメットを着用したいかもしれません。
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
知っていますか?
名前空間内で、さらに2つの名前空間を定義します(すごい!)。今回は「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>
?
とにかく、これは調査するのが楽しかったです。