使用活动模型序列化程序命名空间 API

Namespacing API with Active Model Serializer

我需要为基于 Rails 的应用程序命名空间 API。

我使用 Active Model Serializer 但现在我需要对 API.

进行版本控制

如何?

我还有子域限制。对于API,我希望...

api.domain.com/v1/users/

与(例如):id:name 对于 User

api.domain.com/v2/users/

与(例如):id :name :ranking for User

那么,我应该如何创建不同的 Serializer,每个命名空间一个?

并且...我必须在不同的控制器或不同的文件中创建不同的 Serializer 吗?具体如何?

感谢大家。

更新

部分代码:

routes.rb

constraints subdomain: 'api', default: {format: 'json'} do   #api.domain.com

#API V1
namespace :v1 do 
#resources for v1
end

#API V1
namespace :v2 do 
#resources for v2
end

我在 controllers/v1/resource_controller.rb 中使用 module V1render json: @list 呈现资源的 ALL 信息。

所以,Rails 没有调用我放在 serializers/v1/resource_serializer.rb

中的序列化程序

编辑: 命名空间有效!

您需要创建 2 个控制器、2 个序列化程序并定义您的路由。

namespace :api do
  namespace :v1 do
    resources :foo
  end

  namespace :v2 do
    resources :foo
  end
end

还有你的控制器:

class Api::V1::FooController < ApplicationController
#...
end

class Api::V2::FooController < ApplicationController
#...
end

您的序列化程序还需要在名称中包含 /v1 和 /v2。

按照建议 @Mirza Memic 最好在调用时也指定序列化器 render json:

each_serializer: TopModule::SubModule::CustomSerializer

否则我们可能会得到错误(model_nameread_attribute_for_serialization)如果是一个集合(简单地 serializer: 而不是 each_serializer: ONLY 如果是一个单个对象)

当然控制器必须是每个模块名称的"sub-foldered",建议@Júlio Campos