2012-04-08 4 views
2

Je voudrais faire quelque chose le long des lignes de:actions gerbage-Play Framework 2.0

def findUser[ A ](bp: BodyParser[ A ])(id: Int)(f: User => Action[ A ] => Result) 
def findProfile[ A ](bp: BodyParser[ A ])(id: Int)(f: Profile => Action[ A ] => Result) 

Si les deux (et plus) peuvent être utilisés de façon interchangeable, ou comme suit:

def create = findUser(parse.json) { user => findProfile(parse.json) { profile => implicit request => ... 

Les deux problèmes que j'ai à faire sont liés à parse.json (que je pense pouvoir corriger en passant JsValue comme analyseur de corps dans l'action et le retirer de la signature .. Et pouvoir utiliser un ou plusieurs de ceux-ci actions à volonté ... Des idées?

Merci!

Mise à jour

Déplacé réponse à répondre commentaire ...

+0

La solution ne devrait-elle pas être dans sa propre réponse? –

Répondre

1

j'ai pu le faire fonctionner avec la signature suivante. Ici c'est avec l'analyseur de corps refactorisé ... Vous pouvez mettre ces fonctions d'aide (bodyParser, findUser, findProfile) dans un trait et étendre les contrôleurs avec eux ... Vous pouvez également supprimer l'analyseur de corps entièrement de la signature et passer l'analyse. json dans l'action et donne findUser (id) au lieu de findUser() (id).

val bodyParser = parse.json //(I had to include the entire path to it...) 
def findUser[ A ](bp: BodyParser[ A ] = bodyParser)(id: Int)(f: User => Request[ A ] => Result) 

def find(id: Int) = 
    IsLoggedIn() { 
     findUser()(id) { 
     user => 
     findProfile()(user.id){ 
      profile => 
      request => 
       Ok(toJson(profile)) 
} } } 

Si vous connaissez un moyen plus propre, s'il vous plaît dites-moi.