[Catalyst] A point of confusion/frustration on chained actions

Steve Kleiman steve at prodhub.com
Wed May 19 23:32:06 GMT 2010


I second that. I'm another Catalyst newbie who would like to submit doc patches for review, but I don't know the process....


On May 19, 2010, at 4:24 PM, Jeff Albert wrote:

> As an unabashed Catalyst n00b, I spent a couple of hours earlier this week bashing through this same design conundrum on my own application, and although I did ultimately come up with the solution that Ash describes under my own steam, the Catalyst::DispatchType::Chained documentation didn't do much to help me with the process at all - nor did the Catalyst tutorial.
> 
> I've never contributed, so I don't know the process, but it would be nice to see this information in the documentation. If somebody who knows what's necessary mails me off-list with the information on how to get started, I would be willing hack up Ash's reply into a fairly minimal doc patch in whichever location is appropriate.
> 
> Cheers,
> Jeff
> 
> -----Original Message-----
> From: Ash Berlin [mailto:ash_cpan at firemirror.com] 
> Sent: Wednesday, May 19, 2010 3:39 PM
> To: The elegant MVC web framework
> Subject: Re: [Catalyst] A point of confusion/frustration on chained actions
> 
> On 19 May 2010, at 23:16, Stephen Howard wrote:
>> I am trying to sort out some interdependent chains and I'm having trouble figuring out why the urls I'm trying to build aren't working out.
>> 
>> I have a site where the primary objects of interest are flash-based tutorials.  Each tutorial can have comments, and each comment can have replies.  I'm using jQuery to manipulate comments in a REST fashion, and I'm aiming for a url map like this:
>> 
>> /tutorials                         # GET a list of tutorials, or POST a new tutorial
>> /tutorials/*                       # GET/POST/DELETE a specific tutorial
>> /tutorials/*/comments              # GET the comments for a tutorial, or POST a new comment
>> /tutorials/*/comments/*            # GET/POST/DELETE a specific comment
>> /tutorials/*/comments/*/replies    # GET the replies for a comment, or POST a new reply
>> /tutorials/*/comments/*/replies/*  # GET/POST/DELETE a specific reply
>> 
>> But the best I've been able to come up with is this:
>> 
>> /tutorials
>> ^tutorials/(\d+)$
>> /tutorial/*/comments
>> /tutorial/*/comment/*/replies
>> /tutorial/*/comment/*/reply/*
>> 
>> missing: /tutorial/*/comment (what would I call it? /tutorial/*/cmt ?)
>> 
>> Essentially I'm hitting an issue with is due to the (seeming?) impossibility of matching a chained set of actions at multiple url depths. Is it possible to build the url structure I'm looking for above using chained actions?
>> 
>> thanks,
>> Stephen
> 
> You can get it exactly as you want:
> 
> (manually re-ordered the below to match your desired list)
> [debug] Loaded Chained actions:
> .-------------------------------------+--------------------------------------.
> | Path Spec                           | Private                              |
> +-------------------------------------+--------------------------------------+
> | /tutorials                          | /tutorials (0)                       |
> |                                     | => /all_tutorials                    |
> | /tutorials/*                        | /tutorials (0)                       |
> |                                     | -> /a_tutorial (1)                   |
> |                                     | => /show_tutorial                    |
> | /tutorials/*/comments               | /tutorials (0)                       |
> |                                     | -> /a_tutorial (1)                   |
> |                                     | -> /comments (0)                     |
> |                                     | => /show_tutorial_comments           |
> | /tutorials/*/comments/*             | /tutorials (0)                       |
> |                                     | -> /a_tutorial (1)                   |
> |                                     | -> /comments (0)                     |
> |                                     | -> /a_comment (1)                    |
> |                                     | => /show_comment                     |
> | /tutorials/*/comments/*/replies     | /tutorials (0)                       |
> |                                     | -> /a_tutorial (1)                   |
> |                                     | -> /comments (0)                     |
> |                                     | -> /a_comment (1)                    |
> |                                     | -> /replies (0)                      |
> |                                     | => /show_replies                     |
> | /tutorials/*/comments/*/replies/*   | /tutorials (0)                       |
> |                                     | -> /a_tutorial (1)                   |
> |                                     | -> /comments (0)                     |
> |                                     | -> /a_comment (1)                    |
> |                                     | -> /replies (0)                      |
> |                                     | -> /a_reply (1)                      |
> |                                     | => /show_reply                       |
> '-------------------------------------+--------------------------------------'
> 
> 
> 
> sub tutorials : Chained('/') PathPart CaptureArgs(0) {
>  # stash tutorials rs
> }
> sub all_tutorials : Chained('tutorials') PathPart('') Args(0) {
>  # empty, or set stash for view
> }
> 
> sub a_tutorial : Chained('tutorials') PathPart('') CaptureArgs(1) {
>  # stash tutorial
> }
> sub show_tutorial : Chained('a_tutorial') Args(0) PathPart('') {
> # setup view
> }
> 
> sub comments : Chained('a_tutorial') CaptureArgs(0) PathPart {
>  # stash comments rs from stash->{tutorial}
> }
> 
> # You get the idea hopefully....
> sub show_tutorial_comments : Chained('comments') Args(0) PathPart('') {}
> sub a_comment : Chained('comments') CaptureArgs(1) PathPart('') {}
> 
> sub show_comment : Chained('a_comment') Args(0) PathPart('') { }
> 
> sub replies : Chained('a_comment') PathPart CaptureArgs(0) {}
> sub show_replies : Chained('replies') Args(0) PathPart('') {}
> sub a_reply : Chained('replies') CaptureArgs(1) PathPart('') {}
> sub show_reply : Chained('a_reply') Args(0) PathPart('') {}
> 
> 
> -ash
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
> Dev site: http://dev.catalyst.perl.org/
> 
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
> Dev site: http://dev.catalyst.perl.org/




More information about the Catalyst mailing list