4

问题:

我用我的控制器这样做:

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,这就是我想要命名序列化程序的原因。每个对应的序列化程序以不同的方式使用每个模型。

4

1 回答 1

3

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

似乎没有任何东西可以阻止您手动指定任何想要的序列化程序类,事实上,默认情况下,在命名空间控制器中,使用的LicenseSerializer应该是在模块中查找命名空间类。Api::Product::V1您是否尝试过在适当的命名空间下组织您的序列化程序,以便 rails 类加载将自动解析它们?例如,Api::Product::V1::LicenceSerializer放入app/serializers/api/product/v1/license_serializer.rb

您可能还想查看roar-rails gem,它与 rails 集成并使用与 ruby​​ Web 框架无关的ROAR gem,它支持使用表示模式的两种方式 JSON/XML/JSON+HAL 处理。请注意,您不会像 jbuilder/jsonify 那样控制序列化,但是如果您正在查看 AMS,我猜您希望从细节上有所提升。使用 ROAR,您将获得基于您选择的表示器格式的统一 API,并且更接近真正的超媒体 API。

代表/ROAR 方法的一些基本原理在这里这里这里

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

于 2013-11-07T05:55:06.170 回答