roar icon indicating copy to clipboard operation
roar copied to clipboard

Any easier way for rendering custom properties

Open PikachuEXE opened this issue 10 years ago • 2 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?

PikachuEXE avatar Sep 14 '15 09:09 PikachuEXE

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.

apotonick avatar Sep 14 '15 23:09 apotonick

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.

apotonick avatar Sep 14 '15 23:09 apotonick