I'm trying to get a tg (v2.3.4) controller to deal with a json request with 
contains (as one of its parameters) a list of objects -- the idea being 
that (post validation), I have a variable 'fruit' (see below) as a list of 
anonymous hashes.

I want to *avoid* simply passing a string and evaluating this using 
json.loads()  

I have a straightforward javascripy/jquery function in my template as 
follows:

$.ajax({
    url: "tmp",
    type: 'POST',
    dataType: 'json',
    data: {
      basket_id: 1,
      fruit: [{name:'apples', qty: 2},
              {name:'bananas', qty: 4},
              {name:'oranges', qty: 6}
             ]
      }
}).done(function(resp){
     console.log("I'm back...", resp)
});


I have a formencode Schema used for the validation of the controller's 
method (in two parts) as follows:

from formencode import validators, Schema, ForEach

class FruitSchema(Schema):
    name = validators.String()
    qty = validators.Int()

class FruitbowlSchema(Schema):
    basket_id = validators.Int()
    fruit = ForEach(FruitSchema())


My controller method is as follows:

@expose('json')
@validate(validators=FruitbowlSchema())
def tmp(self, basket_id, fruit):
    log.debug("basket_id: %s", basket_id)
    log.debug("fruit: %s", fruit)
    return dict()


Calling tmp() from the $.ajax I see that (prior to validation) the 
following parameters are included in the request:

basket_id=u'1'                        <type 'unicode'>
fruit[0][qty]=u'2'       <type 'unicode'>
fruit[0][name]=u'apples'   <type 'unicode'>
fruit[1][qty]=u'4'    <type 'unicode'>
fruit[1][name]=u'bananas'  <type 'unicode'>
fruit[2][name]=u'oranges'  <type 'unicode'>
fruit[2][qty]=u'6'    <type 'unicode'>

However, the jquery call is complaining of a 500 error and Turbogears' 
debug gives me:
   TypeError: tmp() got an unexpected keyword argument 'fruit[2][name]'


My understanding is that @validate with formencode can deal with the single 
'fruit' parameter in the controller's method 

And I also have a strong suspicion that I've (successfully) accomplished 
this before -- -- but can't remember how! -- clearly I'm doing something 
wrong here!! 

Can anyone help me out... ?

Many thanks,
Rob 








-- 
You received this message because you are subscribed to the Google Groups 
"TurboGears" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/turbogears.
For more options, visit https://groups.google.com/d/optout.

Reply via email to