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

相關問題