Ruby on rails Rails API的版本控制

Ruby on rails Rails API的版本控制,ruby-on-rails,ruby,api,versioning,Ruby On Rails,Ruby,Api,Versioning,我已经四处搜索了几天,试图弄清楚我是否对rails api进行了适当的版本控制。我还没有找到一个好的答案来帮助我适应目前的方法。因此,我决定去stackoverflow听取我的同事们的意见。让我们看一些代码: 首先,我在routes.rb中向我的api添加了一个名称空间:api,其子域为“api”。我还为v1添加了一个作用域 require 'api_constraints' HostApi::Application.routes.draw do # Api Definition na

我已经四处搜索了几天,试图弄清楚我是否对rails api进行了适当的版本控制。我还没有找到一个好的答案来帮助我适应目前的方法。因此,我决定去stackoverflow听取我的同事们的意见。让我们看一些代码:

首先,我在
routes.rb
中向我的api添加了一个名称空间
:api
,其子域为“api”。我还为
v1
添加了一个作用域

require 'api_constraints'

HostApi::Application.routes.draw do
  # Api Definition
  namespace :api, defaults: { format: :json }, constraints: { subdomain: 'api' }, path: '/' do
    # Scoping Api Version
    scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
      # resources here
    end
  end
end
我想让那些点击api的人返回当前的默认版本,除非他们通过标题指定不同的版本。为了处理这个问题,我在lib目录中创建了一个
api\u约束

用于测试的
lib/api_约束.rb
lib/spec/api_约束.rb

class ApiConstraints

  def initialize(options)
    @version = options[:version]
    @default = options[:default]
  end

  def matches?(request)
    @default || request.headers["Accept"].include?("application/vnd.host_api.v#{@version}")
  end

end
我的考试通过了,一切都很好。我好奇的是当我开始添加版本2,3,4时;它们的作用域是否可以与
v1
的作用域相同?例如:

require 'api_constraints'

HostApi::Application.routes.draw do
  # Api Definition
  namespace :api, defaults: { format: :json }, constraints: { subdomain: 'api' }, path: '/' do
    # Scoping Api Version
    scope module: :v1, constraints: ApiConstraints.new(version: 1) do
      # resources here
    end
    scope module: :v2, constraints: ApiConstraints.new(version: 2, default: true) do
      # resources here
    end
  end
end
我可以想象,将
v2
范围中的passing default true更改为
ApiConstraints
,现在可以将其设置为默认响应(当版本未通过头请求时)。我理解正确吗?有没有比这更好的方法来处理这个版本?非常感谢您的想法、想法、意见


附带问题。我还将
routes.rb
文件中的
Rails.application.routes.draw
更改为
HostApi::application.routes.draw
。这通常是我看到其他人所做的,但我不确定这样做的好处是什么。如果有人能帮我详细说明,我将非常感激。提前感谢所有花时间帮助我理解这一点或只是分享他们想法的人

我在我的项目中使用了相同的
ApiConstraints
,当您尝试使用非默认版本而不指定
Accept
标题时,它会崩溃

我在测试中添加了以下案例(导致崩溃):

我修复了ApiConstraints

def matches?(req)
  @default ||
    (req.respond_to?('headers') &&
     req.headers.key?('Accept') &&
     req.headers['Accept'].include?("application/vnd.host_api.v#{@version}"))
end

希望有帮助

我在我的项目中使用了相同的
ApiConstraints
,当您尝试使用非默认版本而不指定
Accept
标题时,它会崩溃

我在测试中添加了以下案例(导致崩溃):

我修复了ApiConstraints:

def matches?(req)
  @default ||
    (req.respond_to?('headers') &&
     req.headers.key?('Accept') &&
     req.headers['Accept'].include?("application/vnd.host_api.v#{@version}"))
end
希望有帮助