trailblazer / representable

Maps representation documents from and to Ruby objects. Includes JSON, XML and YAML support, plain properties and compositions.
http://trailblazer.to/2.1/docs/representable.html
MIT License
689 stars 108 forks source link

parsing array of arrays #239

Open wangfowen opened 4 years ago

wangfowen commented 4 years ago

Hi there,

I've looked through the documentation and test examples and don't seem to see a way to parse array of arrays. Some JSON I'm trying to parse for example has:

{ other_properties..., choices: [[<choice obj 1_1>], [<choice obj 2_1>, <choice obj 2_2>]] }

I thought standalone collection might work:

class MyRepresenter
   ...
   collection :choices, decorator: ChoicesRepresenter
end

class ChoicesRepresenter
 include Representable::JSON::Collection

 items class: Choice do
   ...
 end
end

If I just do ChoicesRepresenter.new([]).from_json(choices) on an array passed in it works, but nested as the decorator gives this error:

NoMethodError (undefined method `call' for nil:NilClass)

I also tried:

class MyRepresenter
  ...
  collection :choices,
    instance: lambda { |choices| ChoicesRepresenter.for_collection.new([]).from_json(choices.to_json) }
end

class ChoicesRepresenter
  ...

  collection_representer class: Choice
end

That from_json I was also able to verify works on an array passed to it, but in the instance did not work. This gave me:

NoMethodError (undefined method `has_key?' for #)

I've also tried variations of the two with values, to_a, nested collection where i didn't declare the name, extend. None of them worked.