7

我已经阅读了 API 版本控制的最佳实践?. 我同意将版本放在 url 路径而不是 HTTP 标头中。

为了实现这一点,我有一个这样的命名空间控制器:

class Api::V1::UsersController < Api::BaseController
  def show
    ...
  end
end

路线是:

current_api_routes = lambda do
  resource :users
end

namespace :api do
  namespace :v1, &current_api_routes
end

然后rake routes我可以得到这样的路线:

api_v1_user GET    /api/v1/users/:id(.:format)                       api/v1/users#show
...

我希望该版本v1.2转到v1. 然后我可以像这样在控制器中获取次要版本号:

class Api::V1::UsersController < Api::BaseController
  def show
    minor_version = params[:minor_version] # minor_version = 2
    ...
  end
end

有没有办法做到这一点?

4

1 回答 1

5

我们正在使用较小的 API 版本控制进行小的但可能是重大更改(例如允许null以前不允许的属性值)。

# config/routes.rb
My::Application.routes.draw do
  namespace :api do
    scope "v:api_version", module: "v1", as: "v1", constraints: { api_version: /1(\.[0123]?)/ } do
      resources :users
    end
  end
end

# app/controllers/api/application_controller.rb
class API::ApplicationController < ActionController::Base
  private
  def api_version
    @api_version ||= begin
      major, minor = params[:api_version].split('.', 2).map(&:to_i)
      OpenStruct.new(major: major, minor: minor || 0)
    end
  end
end

# app/controllers/api/v1/users_controller.rb
class API::V1::UsersController < API::ApplicationController
  def show
    # ...
    something_more if api_version.minor >= 2
  end
end
于 2015-05-11T10:25:18.813 回答