Now try combining all that with using Chained('.') to spread the chain across controllers! (Which is really damned cool, and I use it to split out my model relations in to chained controllers and actions with and get clean uris).

Hint on how to do this (since I see that come up a lot on the list as well).


In Catalyst::Controller::Admin...

# See previous example for index, add, view, edit and delete actions related to the "Admin" controller

# Add a CaptureArgs method to hook our chain up to the child Admin::Foo
# subcontroller
# NOTE: I am sure you could do some more interesting things here, but I
# prefer to keep all the model interactions and stuff in the real
# controller and just use this as a hook
sub foo : Chained('admin') CaptureArgs(0)
{
  my ( $self, $c ) = @_;
}


In Catalyst::Controller::Admin::Foo...

# Chain endpoint for adding a related foo to a book
# Responds to /admin/[id]/foo/add
sub add : Chained('.') Args(0) { ... }

# Captures a foo id in the chain that is related to
# the book we already have in the chain from earlier
sub get_foo : PathPart('') Chained('.') CaptureArgs(1)
{
  my ( $self, $c, $id) = @_;
  ... # Grab the book from the stash, use it to get the related foo
      # and put THAT in the stash, etc
}

# Chain endpoint for viewing a foo related to a book
# Responds to /admin/[id]/foo/[id]/
sub display : PathPart('') Chained('get_foo') Args(0) { ... }

# Chain endpoint for editing a foo related to a book
# Responds to /admin/[id]/foo/[id]/edit
sub edit : Chained('get_foo') Args(0) { ... }

# Chain endpoint for deleting a foo related to a book
# Responds to /admin/[id]/foo/[id]/delete
sub delete : Chained('get_foo') Args(0) { ... }


Keeps your relations, controllers and uri lyaout nice and clean.

I have seen discussion here previously that Chained('.') is a confusing way to express what is going on - but once you wrap your head around the "Chained() in a Args method is for referring to CaptureArgs methods not uri paths" thing, it starts to make a lot more sense and feels natural.

Hope all this was interesting to *somebody* ;)

Danny Warren

Doran L. Barton wrote:
Danny,
Thanks for your reply. I finally had that epiphany right before your
message came through.

The part I was not understanding was that the argument to the Chained()
action is the private path name:

    # Handles /admin/*
    sub book_detail : PathPart('admin') Chained('/') Args(1) {...}

    # Handler 1 of 2 for /admin/*/{edit,delete}
    sub book_link : PathPart('admin') Chained('/') CaptureArgs(1) {...}

    sub edit : PathPart Chained('book_detail') Args(0) {...}

I wasn't grasping that "minor detail" that the edit() function needed to be
    sub edit : PathPart Chained('admin') Args(0) {...}

Thanks! Now on to the next brick wall. :)

-=Fozz



------------------------------------------------------------------------

_______________________________________________
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/

_______________________________________________
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/

Reply via email to