ruby-on-rails - ネスト - rails routes パラメータ



RailsルートのAPIバージョン管理 (4)

私はStripeのようなAPIをバージョンアップしようとしています。 以下は、最新のAPIバージョンが2であることを示しています。

/api/users/api/v2/users 301を返し/api/v2/users

/api/v1/usersは、バージョン1で200人のユーザーインデックスを返します

/api/v3/users/api/v2/users 301を返し/api/v2/users

/api/asdf/users/api/v2/users 301を返し/api/v2/users

基本的に、バージョンを指定していないものは、指定されたバージョンが存在しない限り最新のものにリンクします。

これは私がこれまで持っているものです:

scope 'api', :format => :json do
  scope 'v:api_version', :api_version => /[12]/ do
    resources :users
  end

  match '/*path', :to => redirect { |params| "/api/v2/#{params[:path]}" }
end

Answer #1

Ryan Biggの答えは私のために働いた。

リダイレクトによってクエリパラメータを保持したい場合は、次のようにすることができます:

match "*path", to: redirect{ |params, request| "/api/v2/#{params[:path]}?#{request.query_string}" }

Answer #2

この回答の元の形式は大きく異なります 。 ここで見つけることができます 。 猫の皮膚を作る方法が複数あることを証明するだけです。

私はネームスペースを使用し、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 。 この場合、 namespaceのブロック内のすべてのルートをApiモジュール内のコントローラに限定し、このルート内のパスへのすべてのリクエストの先頭にapi付けます。 /api/v2/usersなどのリクエストは、ご存じですか?

名前空間の中で、さらに2つの名前空間を定義します(woah!)。 今回は "v1"名前空間を定義しているので、ここのコントローラのすべてのルートはApiモジュール内のV1モジュールの内部にあります: Api::V1resources :users定義することで、このルート内のresources :usersは、コントローラがApi::V1::UsersControllerます。 これはバージョン1で、 /api/v1/usersなどのリクエストを行うことでそこに/api/v1/users

バージョン2はほんの少しだけ違います。 Api::V1::UsersControllerにあるコントローラーの代わりに、 Api::V2::UsersControllerます。 あなたは/api/v2/usersようなリクエストを行うことでそこに行き/api/v2/users

次に、 matchが使用されます。 これは、 /api/v3/usersようなAPIルートに一致します。

これは私が調べなければならなかった部分です。 :to =>オプションを指定すると、特定のリクエストを別の場所にリダイレクトするように指定することができます - それは分かっていましたが、他の場所にリダイレクトしてオリジナルの部分を渡す方法はわかりませんでしたそれに沿ったリクエスト

これを行うには、 redirectメソッドを呼び出し、特殊補間%{path}パラメータを含む文字列を渡します。 この最終matchに一致するリクエストが到着すると、 pathパラメータを文字列内の%{path}場所に補間し、ユーザーを移動する必要のある場所にリダイレクトします。

最後に、別のmatchを使用して、 /api残りのすべてのパスをルーティングし、 /api/v2/%{path}リダイレクトします。 つまり、 /api/usersなどのリクエストは/api/v2/users

/api/asdf/usersをどのようにして一致させるかを知ることができませんでした。なぜなら、 /api/<resource>/<identifier>/api/<version>/<resource>

とにかく、これは研究するのが楽しく、私はそれがあなたを助けることを願っています!


Answer #3

可能であれば、あなたのURLを再考することをお勧めします。そうすれば、バージョンはURLには含まれませんが、acceptsヘッダーに入れられます。 このスタックオーバーフローの答えはうまくいきます:

APIのバージョン管理のベストプラクティス?

このリンクは、レールのルーティングでそれを行う方法を正確に示しています:

http://freelancing-gods.com/posts/versioning_your_ap_is


Answer #4

私はルートによるバージョン管理の大きなファンではない。 より簡単なAPIバージョン管理をサポートするために、 VersionCakeを構築しVersionCakeた。

それぞれのビュー(jbuilder、RABLなど)のファイル名にAPIバージョン番号を含めることで、バージョン管理が邪魔にならないようにし、下位互換性をサポートするように容易に低下させることができます(例えば、ビューのv5が存在しない場合、ビューのv4をレンダリングする)。





versioning