この回答の元の形式は大きく異なり、ここで見つけることができます。猫の皮をむく方法は複数あることを証明してください。
名前空間を使用し、デフォルトの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>?
とにかく、これは調査するのが楽しかったです。