Module: Azeroth::Resourceable

Extended by:
ActiveSupport::Concern
Defined in:
lib/azeroth/resourceable.rb,
lib/azeroth/resourceable/builder.rb,
lib/azeroth/resourceable/class_methods.rb

Overview

Concern for building controller methods for the routes

Examples:

Controller without delete

class DocumentsController < ApplicationController
  include Azeroth::Resourceable

  resource_for :document, except: :delete
end

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

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

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'
# }
}

See Also:

Author:

  • Darthjee

Defined Under Namespace

Modules: ClassMethods Classes: Builder