trailblazer / roar

Parse and render REST API documents using representers.

Home Page:http://www.trailblazer.to/gems/roar

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Any easier way for rendering custom properties

PikachuEXE opened this issue · comments

I am using cells (concept cells)
So I kind of expect support for similar syntax in representable
But this is what I need for rendering a controller loaded neighbourhoods (with a city):

class MyRepresenter < Roar::Decorator
          include Roar::JSON

          self.representation_wrap = :city

          collection :neighbourhoods, getter: -> (args) {
            args[:neighbourhoods]
          } do
            property :name
          end
end

MyRepresenter.new(city).to_json(neighbourhoods: my_custom_neighbourhoods)

I kind of expect

class MyRepresenter < Roar::Decorator
          include Roar::JSON
          include Roar::SomeMagicModule # :P

          self.representation_wrap = :city

          collection :neighbourhoods do
            property :name
          end

          private

          def neighbourhoods
             args[:neighbourhoods] # Still not the best form but still better than setting a lambda in option
          end
end

MyRepresenter.new(city, neighbourhoods: my_custom_neighbourhoods)

I understand the class might also used for parsing input
But is there anyway to NOT use option to get custom input?
Or I should use a custom class (e.g. Struct) for carrying the data into the representer?

I recommend using a domain object (e.g. OpenStruct) that reflects your concern and pass that into the representer.

I keep repeating myself, but forms, cells, and representers are no data-mappers, they use data objects to (re-)present them, and even though they provide some tools for mapping this should happen on the outside.

In the coming months I will push the idea of twins and ROM since domain/data modelling must be a first-class citizen of software engineering.

BTW, if you want neighbourhoods to be called on the decorator, you can do

collection :neighbourhoods, exec_context: :decorator, ..

But this still won't give you access to the args.