问题:
我用我的控制器执行此操作:
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,这就是我想命名序列化程序的原因。每个相应的序列化器使用不同的模型。
答案 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方法的一些基本原理here,here和here。
编辑:您可能还想考虑我的to_json实施。所有当前JSON序列化程序库的性能和灵活性是我项目中的一个重要问题。在尝试了所有替代方案之后,我最终开发了一个干净的JSON DSL,并与Oj作者合作开发了一个高性能的字符串缓冲区/流编组API。我的to_json gem在预算托管服务器上每秒轻松序列化18,000个复杂对象,并且对可生成的JSON结构没有限制。