Rails API 方法级别的版本控制

Rails API Versioning at Method Level

在 .NET 中,我们能够通过注释在方法级别对我们的 API 进行版本控制,并且只复制版本之间不同的方法。我已经切换到使用 Rails 的产品团队,并试图弄清楚是否有什么可以帮助我在 Rails 中做到这一点。到目前为止,我所看到的一切都建议将整个控制器命名空间命名为带有 V1、V2 等的模块......当我们说 V1 和 V2 之间只有一种方法不同时,提供了大大减少数量的潜力需要重复。

谢谢。

Ruby 是一种极其灵活和丰富的语言,避免代码重复应该不难。

管理您的问题的一种肮脏而简单的方法是路由到适当的操作。在 .NET 中,您实际上是通过注释方法而不是使用任何特殊语言功能来路由请求。

# API::V2 implements only special_method
get '/api/v2/special_method', controller: 'API::V2', action: 'special_method' 

# all other actions from V2 are processed by V1
mount API::V1 => '/api/v1'
mount API::V1 => '/api/v2'

另一种更高级的方法是使用模块来实现控制器操作(实例方法)。然后您可以在 API 的 V2 中重用相同的模块并覆盖那些需要更改的方法。

class API::V1
  # implementaton of API::V1
  include ImplV1
end

class API::V2
  # all the methods from V1 are available in V2 too
  include ImplV1

  # override methods from V1 here
  include ImplV2
end

最后,一种更直接但不太灵活的方法是直接从 V1 继承 V2:

class API::V2 < API::V1
  def special_method
    # ...
  end
end