ActiveModel :: Serializers可以像Rails控制器一样拥有命名空间名称(嵌套)吗?

时间:2013-10-02 03:26:01

标签: ruby-on-rails ruby-on-rails-4 active-model-serializers rails-api

问题:

我用我的控制器执行此操作:

class Api::Product::V1::LicenseController < ApplicationController

为什么我不能使用序列化程序执行此操作? (或者我可以吗?)

class Api::Product::V1::LicenseSerializer < ActiveModel::Serializer

背景:

我有多个控制器/路线对应单个模型。

我需要为每个型号配备多个序列化器,这些序列化器与我的控制器一对一。

ActiveModel::Serializers允许您从控制器指定序列化程序,如下所示:

render :json => @license_token, :serializer => LicenseSerializer

那我为什么不能这样做呢?

render :json => @license_token, :serializer => Api::Product::V1::LicenseSerializer

我试图避免像这样的复合名称的丑陋,即使我知道它们会起作用:

  • ProductAlphaLicenseSerializer
  • ProductBravoLicenseSerializer
  • ProductCharlieLicenseSerializer

我的每个模型都支持多个API,这就是我想命名序列化程序的原因。每个相应的序列化器使用不同的模型。

1 个答案:

答案 0 :(得分:3)

如果你解释了你得到的错误(如果有的话),它可能会有所帮助。我对Active Model Serializers有类似的担忧,根据文档显示,AMS只会根据模型类在app/serializers路径中执行自动序列化器查找,因此命名空间控制器与序列化器查找无关。

似乎没有任何东西可以阻止你手动指定任何你想要的序列化程序类,实际上从你的命名空间控制器中使用LicenseSerializer应该在模块中寻找命名空间类{{ 1}}默认情况下。您是否尝试在适当的命名空间下组织序列化程序,以便rails类加载将自动解决它们?例如,将Api::Product::V1放入Api::Product::V1::LicenceSerializer

您可能还希望查看与rails集成的roar-rails gem并使用ruby Web框架不可知ROAR gem,它支持使用代表模式进行双向JSON / XML / JSON + HAL处理。请注意,您不会像控制序列化那样获得jbuilder / jsonify,但如果您正在查看AMS,我猜您希望从某个细节中提升。使用ROAR,您将获得基于您选择的表示符格式的统一API,并且更接近真正的超媒体API。

代表/ ROAR方法的一些基本原理hereherehere

编辑:您可能还想考虑我的to_json实施。所有当前JSON序列化程序库的性能和灵活性是我项目中的一个重要问题。在尝试了所有替代方案之后,我最终开发了一个干净的JSON DSL,并与Oj作者合作开发了一个高性能的字符串缓冲区/流编组API。我的to_json gem在预算托管服务器上每秒轻松序列化18,000个复杂对象,并且对可生成的JSON结构没有限制。