Name

Forward::Guides::Routes::RestfulResources - Rails like resources for Perl Plack web framework developers

Description

Forward::Routes enables web framework developers to build Rails like resources with a single command. The add_resources command automatically generates a bunch of routes to read, create, update or delete a resource or to display a form to perform a create, update or delete action.

# Routes root object
my $routes = Forward::Routes->new;

# Add a resource
$routes->add_resources('cities');

The following routes are generated:

HTTP     Path                 Controller  Action        Route name
request                       parameter   parameter
method          

GET      /cities/new          cities      create_form   cities_create_form
GET      /cities/:id          cities      show          cities_show
GET      /cities/:id/edit     cities      update_form   cities_update_form
GET      /cities/:id/delete   cities      delete_form   cities_delete_form
GET      /cities              cities      index         cities_index
POST     /cities              cities      create        cities_create
PUT      /cities/:id          cities      update        cities_update
DELETE   /cities/:id          cities      delete        cities_delete

Use of routes:

Route name            Used to

cities_create_form    display a form to create a new item
cities_show           display an individual item
cities_update_form    display a form to update an existing item
cities_delete_form    display a form to confirm the deletion of an existing item
cities_index          list all items
cities_create         create a new item
cities_update         update an existing item
cities_delete         delete an existing item

The internal code to generate a resource makes use of nested routes:

my $resource = $routes->add_route('cities');

# get => /cities
$resource->add_route
  ->via('get')
  ->to("cities#index")
  ->name('cities_index');

# post => /cities
$resource->add_route
  ->via('post')
  ->to("cities#create")
  ->name('cities_create');

# get => /cities/new
$resource->add_route('/new')
  ->via('get')
  ->to("cities#create_form")
  ->name('cities_create_form');

# nested route with id placeholder, placeholder can contain everything
# but dots and slashed (constraint)
my $nested = $resource->add_route(':id')
  ->constraints('id' => qr/[^.\/]+/);

# get => /cities/paris
$nested->add_route
  ->via('get')
  ->to("cities#show")
  ->name('cities_show');

# put => /cities/paris
$nested->add_route
  ->via('put')
  ->to("cities#update")
  ->name('cities_update');

# delete => /cities/paris
$nested->add_route
  ->via('delete')
  ->to("cities#delete")
  ->name('cities_delete');

# get => /cities/paris/edit
$nested->add_route('edit')
  ->via('get')
  ->to("cities#update_form")
  ->name('cities_update_form');

# get => /cities/paris/delete
$nested->add_route('delete')
  ->via('get')
  ->to("cities#delete_form")
  ->name('cities_delete_form');