我读过这个 Best practices for API versioning? .我同意将版本放在 url 路径而不是 HTTP header 中。
为了实现这一点,我有一个像这样的命名空间 Controller :
class Api::V1::UsersController < Api::BaseController
def show
...
end
end
路线是:
current_api_routes = lambda do
resource :users
end
namespace :api do
namespace :v1, ¤t_api_routes
end
然后
rake routes
我可以得到这样的路线:api_v1_user GET /api/v1/users/:id(.:format) api/v1/users#show
...
我想要那个版本
v1.2
转到 v1
的 Controller .然后我可以像这样在 Controller 中获得次要版本号:class Api::V1::UsersController < Api::BaseController
def show
minor_version = params[:minor_version] # minor_version = 2
...
end
end
有没有办法实现这一目标?
最佳答案
我们正在使用次要 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
关于ruby-on-rails - 如何编写rails路由以在路径中使用主要和次要版本映射版本化API,例如/api/v1.2/users/1234,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14513950/