gpt4 book ai didi

ruby-on-rails - 如何编写rails路由以在路径中使用主要和次要版本映射版本化API,例如/api/v1.2/users/1234

转载 作者:行者123 更新时间:2023-12-04 05:31:56 25 4
gpt4 key购买 nike

我读过这个 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, &current_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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com