lib/azeroth/decorator.rb in azeroth-0.6.3 vs lib/azeroth/decorator.rb in azeroth-0.6.4
- old
+ new
@@ -82,10 +82,12 @@
# to expose
# @option options_hash if [Symbol,Proc] method/block
# to be called
# checking if an attribute should or should not
# be exposed
+ # @option options_hash decorator [FalseClass,TrueClass,Class]
+ # flag to use or not a decorator or decorator class to be used
#
# @return [Array<Symbol>]
#
# @example
# class DummyModel
@@ -102,9 +104,128 @@
# def name
# [object.first_name, object.last_name].join(' ')
# end
# end
# end
+ #
+ # @example With relations
+ # # pokemon/decorator.rb
+ #
+ # class Pokemon::Decorator < Azeroth::Decorator
+ # expose :name
+ # expose :previous_form_name, as: :evolution_of, if: :evolution?
+ #
+ # def evolution?
+ # previous_form
+ # end
+ #
+ # def previous_form_name
+ # previous_form.name
+ # end
+ # end
+ #
+ # # pokemon/favorite_decorator.rb
+ #
+ # class Pokemon::FavoriteDecorator < Pokemon::Decorator
+ # expose :nickname
+ # end
+ #
+ # # pokemon_master/decorator.rb
+ #
+ # class PokemonMaster < ActiveRecord::Base
+ # has_one :favorite_pokemon, -> { where(favorite: true) },
+ # class_name: 'Pokemon'
+ # has_many :pokemons
+ # end
+ #
+ # # pokemon.rb
+ #
+ # class Pokemon < ActiveRecord::Base
+ # belongs_to :pokemon_master
+ # has_one :previous_form,
+ # class_name: 'Pokemon',
+ # foreign_key: :previous_form_id
+ # end
+ #
+ # # pokemon_master.rb
+ #
+ # class PokemonMaster::Decorator < Azeroth::Decorator
+ # expose :name
+ # expose :age
+ # expose :favorite_pokemon, decorator: Pokemon::FavoriteDecorator
+ # expose :pokemons
+ #
+ # def name
+ # [
+ # first_name,
+ # last_name
+ # ].compact.join(' ')
+ # end
+ # end
+ #
+ # # schema.rb
+ #
+ # ActiveRecord::Schema.define do
+ # self.verbose = false
+ #
+ # create_table :pokemon_masters, force: true do |t|
+ # t.string :first_name, null: false
+ # t.string :last_name
+ # t.integer :age, null: false
+ # end
+ #
+ # create_table :pokemons, force: true do |t|
+ # t.string :name, null: false
+ # t.string :nickname
+ # t.integer :pokemon_master_id
+ # t.boolean :favorite
+ # t.integer :previous_form_id
+ # t.index %i[pokemon_master_id favorite], unique: true
+ # end
+ #
+ # add_foreign_key 'pokemons', 'pokemon_masters'
+ # end
+ #
+ # # test.rb
+ #
+ # master = PokemonMaster.create(
+ # first_name: 'Ash',
+ # last_name: 'Ketchum',
+ # age: 10
+ # )
+ #
+ # master.create_favorite_pokemon(
+ # name: 'pikachu',
+ # nickname: 'Pikachu'
+ # )
+ #
+ # metapod = Pokemon.create(name: :metapod)
+ #
+ # master.pokemons.create(
+ # name: 'butterfree', previous_form: metapod
+ # )
+ # master.pokemons.create(name: 'squirtle')
+ #
+ # decorator = PokemonMaster::Decorator.new(master)
+ #
+ # decorator.as_json
+ # # returns
+ # # {
+ # # 'age' => 10,
+ # # 'name' => 'Ash Ketchum',
+ # # 'favorite_pokemon' => {
+ # # 'name' => 'pikachu',
+ # # 'nickname' => 'Pikachu'
+ # # },
+ # # 'pokemons' => [{
+ # # 'name' => 'butterfree',
+ # # 'evolution_of' => 'metapod'
+ # # }, {
+ # # 'name' => 'squirtle'
+ # # }, {
+ # # 'name' => 'pikachu'
+ # # }]
+ # # }
def expose(attribute, **options_hash)
options = Decorator::Options.new(options_hash)
builder = Sinclair.new(self)
builder.add_method(attribute, "@object.#{attribute}")