[cgiapp] RunmodeDeclare and ValidateRM incompatibility?

Richard Jones ra.jones at dpw.clara.co.uk
Wed Jun 17 17:13:47 EDT 2009


Rhesa Rozendaal wrote:
> Richard Jones wrote:
[..]
>> The problem seems to be that, according to the docs, RunmodeDeclare 
>> will capture variables passed as $self->baz(1, "me") as well as from 
>> the query object. So 'edit ($id)' means $id will capture anything 
>> passed into the rm. What seems odd is that the dfv errors hashref is 
>> also captured in the first arg shifted from @_:
> 
> That's the issue: the arguments aren't shifted off @_, they're assigned 
> from it. CAP::RD rewrites this:
> 
>   runmode something ($some, $variables)
> 
> into this:
> 
>   sub something {
>     my $self = shift;
>     my ($some, $variables) = @_;
> 
>     $some = $self->query->param('some') unless defined $some;
>     $some = $self->param('some')        unless defined $some;
>     ...
> 
> In other words, it tries treating the signature as a regular method 
> signature first, and only falls back to looking in $self->query or 
> $self->param if the variables are still undefined.
> 
> And it also explains why you got the errs hashref in both $id and $errs, 
> since @_ is still unchanged.
> 
> 
>> runmode edit ($id) {
>>    my $errs = shift;
>>
>>    warn Dumper $id; # contains the dfv errors hashref
>>    warn Dumper $errs; # also contains the dfv errors hashref !!
>>
>>    [ .. ]
>> }
>>
>> Of course it all works fine if I switch back to conventional runmode 
>> handling, or to AutoRunmode.
> 
> The other solution would be to recognise that dfv_error_page passes the 
> dfv hashref as the first argument, and name that in your signature:
> 
>   runmode edit ($errs, $id) { ...
> 
> That way, $errs is picked up from @_, while $id is picked up from either 
> $self->query or $self->param (provided dfv_error_page doesn't pass 
> additional parameters).

Hi Rhesa,

OK, first thoughts (without actually trying it), are that "runmode edit 
($errs, $id)" would work OK for the error return from update(), but not 
when edit() is called from the query - as /myapp/edit/1 - since the 
value of '1' would get taken into $errs, leaving $id undef. No?
-- 
Richard Jones


More information about the cgiapp mailing list