Hey All
I've got a curly one....
My reactor.xml has:
<object name="Agency">
<hasMany name="Contract">
<relate from="AgencyUUID" to="AgencyUUID"/>
</hasMany>
</object>
<object name="Contract">
<hasOne name="Agency">
<relate from="AgencyUUID" to="AgencyUUID"/>
</hasOne>
</object>
I have some code that creates a new contract...
<cfset objContractRecord = variables.objReactor.createRecord('Contract')>
<cfset objContractRecord.setContractUUID(createUUID())>
<cfset objContractRecord.setAgencyUUID(arguments.agencyUUID)>
<cfset objContractRecord.setStartDate(arguments.startDate)>
<cfset objContractRecord.setEndDate(arguments.endDate)>
<cfset objContractRecord.setValue(arguments.value)>
<cfset objContractRecord.setDescription(arguments.description)>
<cfset objContractRecord.validate()>
<cfif NOT objContractRecord.hasErrors()>
<cfset objContractRecord.save()>
</cfif>
...but hasErrors() is returning true.
...but objContractRecord._getErrorCollection()_getErrorsTranslated()
is returning an empty array.
So where is my error?
I ended up digging into the hasErrors() method of the abstractRecord
object and found that it checks children as well as the current object
(not sure I like that idea, but anyway).
So I create a getChildren() method in my ContractRecord and run the following:
<cfset children = objContractRecord.getChildren()>
<cfloop collection="#children#" item="child">
<cfdump var="#children[child].validated()#"><br>
<cfdump var="#children[child].hasErrors()#"><br>
<cfdump
var="#children[child]._getErrorCollection().getTranslatedErrors()#"><br>
<cfdump var="#children[child]._getTO()#"><br>
</cfloop>
From this I can tell:
* I have one child, an AgencyRecord object
* children[child].validated() is true
* children[child].hasErrors() is true
* children[child]._getErrorCollection().getTranslatedErrors() returns
a number of errors
* children[child]._getTO() returns an EMPTY AgencyTO
I scratch my head, go have some lunch and when I get back I add one
line to my code:
<cfset objContractRecord.getAgency()>
..just before the <cfset objContractRecord.validate()>
Now everything works - no validation errors.
All of this has me stumped for a number of reasons:
- Why is an child AgencyRecord getting checked when I validate a ContractRecord?
- When it fails why does it fail silently? Could it not report the
problem to the ContractRecords ErrorCollection?
- Why is my AgencyRecord reporting that it has been validated? I
certainly didn't run validate() on it (I didn't even know it was
there). Maybe _setErrorCollection() is being called on it somewhere
during instantiation?
Anyway sorry for the rant and thanks in advance for any advice.
--
Mark Stanton
Gruden Pty Ltd
http://www.gruden.com
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Reactor for ColdFusion Mailing List
[email protected]
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --