Help - I'm going round in circles with Catalyst actions. I want http://localhost:3000/search to map to the method search() in MyApp::Controller::Search, so I defined the method as:

sub search : Path Form('/search') { # a formbuilder method
 if ( $form->submitted && $form->validate ) {
   $c->detach('retrieve');
 }
 # etc;
}

sub retrieve : Private {
 # performs db lookup, results in $rs, then:

 if (! $rs->pager->total_entries || $rs->pager->total_entries > 1000) {
$c->stash->{error_msg} = sprintf 'Total records matched = %s, please refine search', $rs->pager->total_entries;
   $c->detach('search'); # re-load search form with message
 }
 else {
   # display results in template
 }
}

Now, if the $rs->pager->total_entries value triggers $c->detach('search'), then the following error is generated:

Couldn't render template "file error - search/search: not found"

I also sometime see [% Catalyst.uri_for('search') %] translating to 'base_url/search/search' in the template, and though ugly, it does work.

It's probably got something to do with the definition of search() as an empty Path, but that's the only way I could get the the address to read http://localhost:3000/search as opposed to something ugly like http://localhost:3000/search/search, as it does if I define search() as a Local action, ie 'sub search : Local'.

I've also tried playing with calling the default method 'index' and 'default', and various attributes Local, Path, Global (I know that one's wrong) but ran into problems with all of those. I can't do a $c->res->redirect to the url '/search' as I need the original search params reloading. Can anyone see an obvious solution to this? Probably to do it the correct way!

--
Richard Jones

_______________________________________________
List: http://lists.rawmode.org/cgi-bin/mailman/listinfo/dbix-class
Wiki: http://dbix-class.shadowcatsystems.co.uk/
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/trunk/DBIx-Class/
Searchable Archive: http://www.mail-archive.com/[email protected]/

Reply via email to