Using CGI::Application::Dispatch with CGI::Application::Dispatch::Server

Editing a record with: <form method="post" action="/foo/update/2">
# form contains record #2 data

CAD table is configured as :app/:rm/:id, so the request is handled by Foo::update

###################
package Foo;
sub update {
  my $self = shift;
  my $vars = $self->query->Vars;

  if ( my $id = $self->param('id') ) {
    $vars->{id} = $id; # should only contain a value if an update req.
  }
  # update db with content of $vars;
}
####################

This works as intended - updates record #2. But if my next action is to request a form to create a new record - eg http://localhost:8080/foo -

<form method="post" action="/foo/new_record">
# form populated with new data unrelated to previous edit

on submission of the form, instead of getting a new record created I get an update of an existing record, which gets clobbered with the new incoming data. That's because $vars{id} (generated in same way as above) contains the value of the previous action id.

With CAD debugging switched on, for an unrelated url request, for example http://localhost:8080/bar, console output is:
Final args to pass to new(): $VAR1 = {
  'PARAMS' => {
    'config_files' => [
      './config/config.pl',
      './config/validation.pl'
    ],
    'id' => '2' ###### <==
  }
};

That value of 'id' (2 in this case) persisted from the previous action, and will continue to live indefinitely across multiple requests until it is either superceded by another id, or until I re-start the CAD server.

The solution (so far) is to avoid the use of $self->param('id') entirely and pass the id in as a hidden form field. But that partly defeats the functionality of the CAD table declaration.

I can't work out why the id param is being retained across requests like this, whether it's a problem related to using CAD/CAD::Server, or something I've overlooked in my app or CAD setup. But as it stands it is potentially lethal as it will sooner or later update the wrong record.
--
Richard Jones

#####  CGI::Application community mailing list  ################
##                                                            ##
##  To unsubscribe, or change your message delivery options,  ##
##  visit:  http://www.erlbaum.net/mailman/listinfo/cgiapp    ##
##                                                            ##
##  Web archive:   http://www.erlbaum.net/pipermail/cgiapp/   ##
##  Wiki:          http://cgiapp.erlbaum.net/                 ##
##                                                            ##
################################################################

Reply via email to