[Dbix-class] Catalyst actions

Richard Jones ra.jones at dpw.clara.co.uk
Thu May 17 16:29:02 GMT 2007


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 




More information about the Dbix-class mailing list