【问题标题】:Namespacing API with Active Model Serializer使用 Active Model Serializer 的命名空间 API
【发布时间】:2016-09-16 18:15:34
【问题描述】:

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

我使用Active Model Serializer,但现在我需要对我的 API 进行版本控制。

怎么做?

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

api.domain.com/v1/users/

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

api.domain.com/v2/users/

与(例如):id :name :rankingUser

那么,我应该如何为每个命名空间创建不同的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.rbmodule V1render json: @list 中呈现资源的ALL信息。

所以,Rails 没有调用我放在 serializers/v1/resource_serializer.rb 中的序列化程序

编辑:命名空间有效!

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

您需要创建 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。

【讨论】:

  • 谢谢。我想我已经接近解决方案了。你能再清楚一点吗?我需要序列化程序中的子文件夹吗?还是只有一个 .rb 文件和不同类的名称为 V1 和 V2 的不同类?
  • 只有不同的文件。
【解决方案2】:

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

each_serializer: TopModule::SubModule::CustomSerializer

否则,如果是集合,我们可能会出错(model_nameread_attribute_for_serialization)(只需 serializer: 而不是 each_serializer:仅当是单个对象时

当然控制器必须为每个模块名称“子文件夹”,如建议@Júlio Campos

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多