Module: Azeroth::Resourceable::ClassMethods
- Defined in:
- lib/azeroth/resourceable/class_methods.rb
Overview
Class methods added by Azeroth::Resourceable
Author:
-
Darthjee
Instance Method Summary collapse
-
#resource_for(name, **options) ⇒ Array<MethodDefinition>
Adds resource methods for resource.
Instance Method Details
#resource_for(name, **options) ⇒ Array<MethodDefinition>
Adds resource methods for resource
Examples:
Controller without delete
Controller without delete
class DocumentsController < ApplicationController
include Azeroth::Resourceable
resource_for :document, except: :delete
end
Controller with only create, show and list
Controller with only create, show and list
class DocumentsController < ApplicationController
include Azeroth::Resourceable
resource_for :document, only: %w[create index show]
end
complete example gmaes and publishers
complete example gmaes and publishers
class PublishersController < ApplicationController
include Azeroth::Resourceable
skip_before_action :verify_authenticity_token
resource_for :publisher, only: %i[create index]
end
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
ActiveRecord::Schema.define do
self.verbose = false
create_table :publishers, force: true do |t|
t.string :name
end
create_table :games, force: true do |t|
t.string :name
t.integer :publisher_id
end
end
class Publisher < ActiveRecord::Base
has_many :games
end
class Game < ActiveRecord::Base
belongs_to :publisher
end
class Game::Decorator < Azeroth::Decorator
expose :id
expose :name
expose :publisher, decorator: NameDecorator
end
requesting games and publishers
requesting games and publishers
post "/publishers.json", params: {
publisher: {
name: 'Nintendo'
}
}
publisher = JSON.parse(response.body)
# returns
# {
# 'id' => 11,
# 'name' => 'Nintendo'
# }
publisher = Publisher.last
post "/publishers/#{publisher['id']}/games.json", params: {
game: {
name: 'Pokemon'
}
}
game = Game.last
JSON.parse(response.body)
# returns
# {
# id: game.id,
# name: 'Pokemon',
# publisher: {
# name: 'Nintendo'
# }
# }
Controller with before_save
Controller with before_save
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
Controller with paginated index response
Controller with paginated index response
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
}
Parameters:
-
name
(String, Symbol)
—
Name of the resource
-
options
(Hash)
—
resource building options
Options Hash (**options):
-
only
(Array<Symbol,String>, Symbol, String)
—
List of actions to be built
-
except
(Array<Symbol,String>, Symbol, String)
—
List of actions to not to be built
-
decorator
(Azeroth::Decorator, TrueClass, FalseClass)
—
Decorator class or flag allowing/disallowing decorators
-
before_save
(Symbol, Proc)
—
method/block to be ran on the controller before saving the resource
-
after_save
(Symbol, Proc)
—
method/block to be ran on the controller after saving the resource
-
build_with
(Symbol, Proc)
—
method/block to be ran when building resource (default proc { <resource_collection>.build(resource_params) }
-
update_with
(Symbol, Proc)
—
method/block to be ran when updating resource (default proc { <resource>.update(resource_params) }
-
paginated
(TrueClass, FalseClass)
—
flag defining if index endpoint should be paginated
-
per_page
(Integer)
—
number of entries returned per page on index
Returns:
-
(Array<MethodDefinition>)
—
list of methods created
See Also:
18 19 20 21 22 |
# File 'lib/azeroth/resourceable/class_methods.rb', line 18 def resource_for(name, **options) Builder.new( self, name, Azeroth::Options.new(options) ).build end |