4

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

我做我的控制器:

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,这就是为什么我想namesp ace序列化程序。每个对应的串行器对每个模型的使用都不相同。

+0

嘿克里斯,我很好奇你最终做了什么。我目前也在尝试通过命名空间来组织我的active_model_serializers。问题是,如果我只是使用Class名称而不是名称空间和Classname,那么它不起作用。因此,例如:'render:json => @license_token,:serializer => Api :: Product :: V1 :: LicenseSerializer'适用于我,而不是'render:json => @license_token,:serializer => LicenseSerializer' – Andy

回答

3

如果你解释你得到的错误(如果有的话),它可能会有所帮助。我对Active Model Serializer也有类似的担忧,根据文档显示,AMS只会根据模型类别在app/serializers路径中执行自动串行器查找,因此命名空间控制器对串行器查找没有任何影响。

似乎没有要任何东西阻止你从你的命名空间的控制器内指定想手动任何序列化器类,实际上使用的LicenseSerializer应的模块Api::Product::V1默认情况下是在寻找命名空间类。你有没有尝试在适当的命名空间下组织你的序列化程序,这样rails class loading会自动解决它们?例如,Api::Product::V1::LicenceSerializerapp/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方法的一些基本原理here,herehere

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

+0

你,安德鲁!您关于在适当的命名空间下组织我的序列化器的评论只是我需要的角度转变。 – Chris

+0

并感谢关于ROAR的提示。我现在相当致力于AMS,因为它的默认配置与Ember.js无缝配合,但我一定会考虑ROAR。 – Chris

+0

@Chris你到底有什么用?组织选择器部分没有为我工作.. – geoboy

相关问题