[Catalyst] default end paths and forwarding

Bill Moseley moseley at hank.org
Thu Dec 15 16:33:27 CET 2005


On Thu, Dec 15, 2005 at 09:59:04AM -0500, John Lifsey - Contractor - wrote:
> It may be that I'm going about this the wrong way, but I have my default 
> end setup to set
> stash->{template}||=$c->req->path

C::View::TT already does something like this:

    my $template = $c->stash->{template}
      || ( $c->request->match || $c->request->action ) . 
           $self->config->{TEMPLATE_EXTENSION};

> this works great for those tiny little actions that don't need entire 
> subs just to specify a template, but since it relies on path, breaks if 
> I forward to an action.

I had a similar problem when forwarding to an action in a different
controller namespace in that links (via c.uri_for ) were wrong --
they referred to the original action, not the forwarded action.

So, my solution was to do a subrequest instead of a forward.  Then it's
just like the forwarded action was the original action.

I use this in my app base class:

sub internal_redirect {
    my ( $c, $action, @args ) = @_;

    unless ( defined $action ) {
        $action = $c->action->namespace;
    } else {
        $action = join '/', $c->action->namespace, $action unless $action =~ m!^/!;
    }

    $c->res->body( $c->subreq( $action, @args ) );
    return;
}

And use $c->internal_redirect instead of $c->forward.




-- 
Bill Moseley
moseley at hank.org




More information about the Catalyst mailing list