[Catalyst] Chained, root action, with default sub present

Matija Grabnar matija at serverflow.com
Mon Aug 10 19:56:29 GMT 2009


fREW Schmidt wrote:
>
>
> On Mon, Aug 10, 2009 at 1:00 PM, Matija Grabnar <matija at serverflow.com 
> <mailto:matija at serverflow.com>> wrote:
>
>     J. Shirley wrote:
>
>         On Sun, Aug 9, 2009 at 7:31 AM, Matija Grabnar
>         <matija at serverflow.com <mailto:matija at serverflow.com>
>         <mailto:matija at serverflow.com <mailto:matija at serverflow.com>>>
>         wrote:
>
>            I think this may be either a bug or something I don't
>         understand
>            about specifying chained actions.
>
>            Suppose I have a controller which has a defined default action
>            (such as created by catalyst.pl by default, i.e.
>
>
>            sub default :Path {
>              my ( $self, $c ) = @_;
>              $c->response->body( 'Page not found' );
>              $c->response->status(404);
>            }
>
>            To that I add a root action, the start of the chain, like so:
>
>            sub index :Chained('/') PathPart('') :Args(0) {
>              my ( $self, $c ) = @_;
>
>              # Hello World
>              $c->response->body( $c->welcome_message );
>            }
>
>            Now, whenever I request '/' from that script, default action
>            triggers, and the index action doesn't.
>            If I comment out the default action, the index DOES get called.
>
>            Is this a bug? If not, what do I have to change to have
>         both index
>            and default in my root controller?
>
>
>         Hi Matija,
>
>         If you change the default attributes to "Private" it will do
>         what you expect.  I think this may be a bug, though (thought
>         this was fixed, but I may be remembering wrong).
>
>     Ah, not quite. Setting private on "default" does cause index to be
>     called when fetching "/", but now
>     default doesn't get called for unknown paths.
>
>
>         The index action should match "/" (though, in this
>         circumstance you aren't really chaining to anything, so it
>         would make more sense to use sub index : Path, which would do
>         what you expect)
>
>
>     To demonstrate the bug, I tried to make a minimal script that
>     still showed it. The original script, the one which led me to
>     discover this bug, was considerably bigger, and did indeed need /
>     as part of the chain. But there's no point in posting the whole,
>     multi-controller beast if I can demonstrate the bug with the most
>     basic, two subroutine controller.
>
>
> I think the problem is that you have it defined as Chained.  Is that 
> what you want?  I think you just want
>
>    index : Path Args(0) { ... }
With the default marked private, it doesn't get called whether index is 
chained or not, so that doesn't help.

And yes, as I said above, this was just a minimal test case to 
demonstrate the bug. The original script is bigger, and I think I have 
stuff chaining off index there.



More information about the Catalyst mailing list