[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