2013-03-13 3 views
4

В контроллере у меня есть respond_with вроде этого:Customizing выход JSON

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 а s «LayerOne»

respond_with(@Layer1, root: 'LayerOne') 

, но помните, в самом начале у меня было две вещи, чтобы перейти к контроллеру, так что теперь я не могу понять наш, как сделать это для второй части JSON, который говорит «Layer2»

ответ

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) 
+0

блестящий ..... еще не попробовал это, но просто чтение того, что у вас здесь, звучит как правильное решение ... plesse обновите его, если найдете новые подсказки или трюки об этом тоже. Благодарю. – Bohn

0

Railcasts имеет превосходное видео + текст учебника по AR Serializer, я уверен, вы найдете ответ на свой вопрос

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

+0

YEP Я наблюдал это, но не мог Решите вопрос, который я разместил. Есть идеи? – Bohn

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 
     } 
    ] 
} 

надеюсь, что это помогает :)

EDIT 2:

Вы можете создать массив сериализатора передать переменные:

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

и в вас вид г:

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

печати в формате JSON:

[ 
    [ 
     "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" 
      } 
     ] 
    ] 
] 
+0

Ой хорошо это не использует Serializer, это просто старый стиль as_json ....У меня лучше, чем у JBuidler. Здесь мне хотелось оценить Serializer, – Bohn

1

Использование JBuilder DSL является отличным способом, чтобы решить вашу проблему.

https://github.com/rails/jbuilder

Ответ JSON вы хотите реализован как вид, что дает вам полный контроль над тем, как это делает.

+0

Спасибо, я уже написал это в JBuilder, хотел оценить Serializer и посмотреть, насколько сложно/легко это сделать в настройке материала в сравнении с JBuilder. – Bohn

+0

Ну, я думаю, вы ответили на этот вопрос: D –