4

コントローラには、次のようなrespond_withがあります。

respond_with(@layer1 , @layer2)

必要なJSON出力は次のようになります。

{
   "LayerOne": [
      {
         "name": "haha",
         "number":"44"
      }, // more .... 
   ],
  "LayerTwo": [
     {
        "name": "James Bond",
        "score": 20
     } // , ....
  ]
}

したがって、最初のセクションを取得するために、次のようにシリアライザーを記述します。

class Layer1Serializer < ActiveModel::Serializer

  attributes :number, :name

  def name
    object.person.name
  end

end

そして、コントローラーを次のように変更します。これにより、ROOTを渡して、JSONに「LayerOne」として表示されるようになります。

respond_with(@Layer1, root: 'LayerOne')

ただし、最初はコントローラーに渡すものが2つあったことを思い出してください。そのため、「Layer2」と書かれたJSONの2番目のセクションでこれを行う方法がわかりません。

4

4 に答える 4

6

次の中間クラスを作成できます。

class BothLayers
  include ActiveModel
  def initialize(layer1,layer2)
    @layer1 = layer1
    @layer2 = layer2
  end
  attr_accessor :layer1, :layer2
end

および次のシリアライザー:

class BothLayersSerializer < ActiveModel::Serializer
  root false
  has_many :layer1, key: "LayerOne"
  has_many :layer2, key: "LayerTwo"
end      

次に、コントローラーで:

    both_layers = BothLayers.new(@layer1,@layer2)
    respond_with( both_layers, serializer: BothLayersSerializer )
于 2013-03-21T21:08:40.750 に答える
1

新しいハッシュを作成し、配列値をそのハッシュに渡します。

respond_with({:LayerOne => @layer1.as_json(:only => [:name, :percentage]), :LayerTwo => @layer2.as_json(:only => [:name, :off_target_by])})

私はこのjsonを手に入れました:

{
    "LayerOne": [
        {
            "name": "layer1",
            "percentage": "10.11"
        },
        {
            "name": "layer 1 bis",
            "percentage": "1212.0"
        }
    ],
    "LayerTwo": [
        {
            "name": "layer 2",
            "off_target_by": 2
        },
        {
            "name": "layer 2 bis",
            "off_target_by": 9
        }
    ]
}

それが役に立てば幸い :)

編集2:

配列シリアライザーを作成して、変数を渡すことができます。

class LayerArraySerializer < ActiveModel::ArraySerializer
  self.root = false
end

そしてあなたの見解では:

respond_with({:LayerOne => @layer1 , :LayerTwo => @layer2}, :serializer => LayerArraySerializer)

json print:

[
    [
        "LayerOne",
        [
            {
                "percentage": "10.11",
                "name": "layer1"
            },
            {
                "percentage": "1212.0",
                "name": "layer 1 bis"
            }
        ]
    ],
    [
        "LayerTwo",
        [
            {
                "off_target_by": 2,
                "name": "layer 2"
            },
            {
                "off_target_by": 9,
                "name": "layer 2 bis"
            }
        ]
    ]
]
于 2013-03-17T10:57:16.337 に答える
1

JBuilder DSLを使用することは、問題を解決するための優れた方法です。

https://github.com/rails/jbuilder

必要なJSON応答はビューとして実装され、レンダリング方法を完全に制御できます。

于 2013-03-17T12:45:31.620 に答える
0

Railcastsには、ARシリアライザーに関する優れたビデオ+テキストチュートリアルがあります。そこで答えが見つかると確信しています。

http://railscasts.com/episodes/409-active-model-serializers

于 2013-03-13T23:52:54.530 に答える