1

私は宝石を使用しているレールアプリactive_model_serializersを持っています。私の回答では、私の結果を"data":親の中に入れたいです。Rails ActiveModel :: Serializerのネストレスポンス "data":parent

{ 
    "data": [] 
} 

は私も同じフォーマットを使用したい:

[] 

私がしたいことは、このようなものです:私は、私は、次のJSONを取得し、応答するためにどのようなデータを得ることはありません現在とき私はデータを持っている場合は、次のように:

{ 
    "data": [ 
    { 
     "id": 135, 
     [...] 

私はこのように、render jsonを使用して、私が欲しいの構造を得ることができました:

render json: { data: respond_values} 

しかし、この場合、私のシリアライザは無視され、モデル内のすべての属性が返されます。私が代わりにrespond_with私のシリアライザの作品を使用している場合

class TranslationSerializer < ActiveModel::Serializer 
    attributes :id, :value, :created_at, :updated_at, :language_id 
    has_one :language 
    has_one :localized_string, serializer: LocalizedStringParentSerializer 
end 

が、私は私が望む構造得ることはありません - データの親/コンテナが不足していた:私のシリアライザはこのようになります。

私のシリアライザが正しく動作するために必要なものは何ですか?

+1

試してください: 'JSONをレンダリング:respond_values、each_serializer:TranslationSerializer、ルート:「data'' – 7urkm3n

答えて

2

まず第一に、あなたがJSON:APIアダプター使用レガシーAPIをサポートする必要がない限り、デフォルトのActiveModelSerializersによって

は属性アダプター(無 JSONルート)を使用しますが。ただし、jsonapiアダプタを使用することを強くお勧めします。 は、jsonapi.org/formatで指定されたフォーマットの1.0に従います。

JSON:APIのすべての設計上の決定に完全に同意する人はいませんが、EmberやAngularなどのフロントエンドフレームワークで広くサポートされており、さらなる牽引力を得る可能性があります。

それ以外の場合は、JSONアダプタでルートキーを設定できないため、独自のアダプタを作成する必要があります。何らかの理由で

# lib/active_model_serializers/adapters/bikeshed_adapter.rb 
module ActiveModelSerializers 
    module Adapters 
    class BikeshedAdapter < Json 
     def root 
     :data 
     end 
    end 
    end 
end 

ActiveModelSerializers.config.adapter = :bikeshed 
+0

おかげで、私はjson_api'アダプター'にビルドを使用するようにしようとしましたが、私はそれが得ることができませんでした仕事(https://github.com/rails-api/active_model_serializers/blob/master/docs/general/adapters.md)。私は 'ActiveModelSerializers.config.adapter =:json_api'で' initializers/active_model_serializers.rb'のような初期化子を作成しましたが、何も起こりませんでした。 – Anders

+0

サーバーを再起動しましたか?初期化ファイルは、サーバーの始動時に読み取られます。 – max

+0

はい、しました。しかし、それは何もしていないようです。 – Anders

0

、Railsはモデルに一致するシリアライザを見つけていません。シリアライザを使用しているモデルの規約名/名前空間に何かがないことがあります。

https://github.com/rails-api/active_model_serializers/blob/master/docs/general/rendering.md

しかし、あなたは明示的には、シリアライザを宣言した場合、それが動作するはずです。

render json: @post, serializer: PostPreviewSerializer 
関連する問題