Azeroth
Yard Documentation
https://www.rubydoc.info/gems/azeroth/1.1.0
Azeroth has been designed making the coding of controllers easier as routes in controllers are usually copy, paste and replace of same code.
Azeroth was originally developed for controller actions
which will respond with json or template rendering based
on the requested format .json
or .html
where html
rendering
does not perform database operations
Future versions will enable html
rendering to also perform
database operations.
Current Release: 1.1.0
Installation
- Install it
gem install azeroth
- Or add Sinclair to your
Gemfile
andbundle install
:
gem 'azeroth'
bundle install azeroth
Usage
Azeroth::Resourceable
Resourceable
module adds class method resource_for
which adds a resource and action methods for create
, show
, index
,
update
, delete
, edit
It accepts options
- only: List of actions to be built
- except: List of actions to not to be built
- decorator: Decorator class or flag allowing/disallowing decorators
- before_save: Method/Proc to be ran before saving the resource on create or update
- after_save: Method/Proc to be ran after saving the resource on create or update
- build_with: Method/Block to be ran when building the reource on create
- update_with: Method/Block to be ran when updating the reource on update
- paginated: Flag when pagination should be applied
- per_page: Number of items returned when pagination is active
# publishers_controller.rb
class PublishersController < ApplicationController
include Azeroth::Resourceable
skip_before_action :verify_authenticity_token
resource_for :publisher, only: %i[create index]
end
# games_controller.rb
class GamesController < ApplicationController
include Azeroth::Resourceable
skip_before_action :verify_authenticity_token
resource_for :game, except: :delete
private
def games
publisher.games
end
def publisher
@publisher ||= Publisher.find(publisher_id)
end
def publisher_id
params.require(:publisher_id)
end
end
# pokemons_controller.rb
class PokemonsController < ApplicationController
include Azeroth::Resourceable
resource_for :pokemon,
only: %i[create update],
before_save: :set_favorite
private
def set_favorite
pokemon.favorite = true
end
def pokemons
master.pokemons
end
def master
@master ||= PokemonMaster.find(master_id)
end
def master_id
params.require(:pokemon_master_id)
end
end
class PaginatedDocumentsController < ApplicationController
include Azeroth::Resourceable
resource_for :document, only: 'index', paginated: true
end
30.times { create(:document) }
get '/paginated_documents.json'
# returns Array with 20 first documents
# returns in the headers pagination headers
# {
# 'pages' => 2,
# 'per_page' => 20,
# 'page' => 1
# }
get '/paginated_documents.json?page=2'
# returns Array with 10 next documents
# returns in the headers pagination headers
# {
# 'pages' => 2,
# 'per_page' => 20,
# 'page' => 2
# }
Azeroth::Decorator
Decorators are used to define how an object is exposed as json on controller responses defining which and how fields will be exposed
Exposing options:
- as: custom key to expose the value as
- if: method/block to be called checking if an attribute should or should not be exposed
- decorator: flag to use or not a decorator or decorator class to be used
- reader: Flag indicating if a reader to access the attribute should be created. usefull if you want method_missing to take over
- override: Flag indicating if an existing method should be overriden. This is useful when a method acessor was included from another module
# 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
Exposing is done through the class method expose which accepts several options:
- as: custom key to expose
- if: method/block to be called checking if an attribute should or should not be exposed
- decorator: flag to use or not a decorator or decorator class to be used