On Sun, Dec 13, 2009 at 11:00 AM, Jonathan Logue
<[email protected]> wrote:
> This is what I still don't get... I am deleting *after* I make a local
> copy of the key's value...
>
> <cfset var class = structFind(args,'class') />
> <cfset structDelete(args,'class') />
Right, which means that this works the first time the function
executes, but the key is then removed from a structure that is a
property of an internal, cached MG object. The event handler object is
created when the application is initialized, not on every request, so
once the argument is gone, any subsequent call to the method will fail
due to the fact that it has been removed.
The crucial thing to understand here is that the variable assignment
of args = arguments.event.getAllArguments() does *not* create a copy
of the arguments structure, but a reference to the structure stored
within the framework's internal object. Using duplicate() circumvents
this, as it creates a copy instead, and therefore the internal
arguments structure is not modified.
> Good point - I should probably use duplicate() anyway. The reason I
> want to modify the arguments is that this method is a factory method
> to return data from the model. I want to strip out "class" and
> "returnVariable" before sending along.
>
> <message name="getObjectsByClass">
> <argument name="class" value="Widget" />
> <argument name="WIDGET_TYPE" value="toy" />
> <argument name="ACTIVE" value="1" />
> <argument name="returnVariable" value="oWidgetRS" />
> </message>
Another way you could approach this would be to copy the arguments themselves:
<cfset var args = structNew() />
<cfset args.WIDGET_TYPE = arguments.event.getArgument("WIDGET_TYPE") />
<cfset args.ACTIVE = arguments.event.getArgument("ACTIVE") />
Or if you have varying properties, you could do this dynamically by
looping over the arguments, excluding the class and returnVariable
keys:
<cfset var args = structNew() />
<cfset var mgArgs = arguments.event.getAllArguments() />
<cfset var key = "" />
<cfloop collection="#mgArgs#" item="key">
<cfif key neq "class" and key neq "returnVariable">
<cfset args[key] = mgArgs[key] />
</cfif>
</cfloop>
If all that seems like more effort than it's worth, then just change
the line that sets the args variable like so and you should be good to
go:
<cfset var args = duplicate(arguments.event.getAllArguments()) />
--
Ezra Parker
--
Model-Glue Sites:
Home Page: http://www.model-glue.com
Documentation: http://docs.model-glue.com
Bug Tracker: http://bugs.model-glue.com
Blog: http://www.model-glue.com/blog
You received this message because you are subscribed to the Google
Groups "model-glue" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/model-glue?hl=en