加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何编写rails路由来映射带有主要版本和次要版

发布时间:2020-12-17 03:15:42 所属栏目:百科 来源:网络整理
导读:我已经阅读了这个 Best practices for API versioning?.我同意将该版本放在url路径而不是HTTP头中. 为了实现这一点,我有一个像这样的命名空间控制器: class Api::V1::UsersController Api::BaseController def show ... endend 路线是: current_api_routes
我已经阅读了这个 Best practices for API versioning?.我同意将该版本放在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

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

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

有没有办法实现这个目标?

解决方法

我们正在使用次要的API版本控制,但很小但可能会破坏更改(例如,允许以前不允许的属性的空值).

# 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读