2016-07-06 2 views
0

Je la forme suivante:.Comment traiter un formulaire Yesod paramétré à partir d'un gestionnaire dans lequel le paramètre est indisponible?

userForm :: UserId -> Form UserDemographics 
userForm uid = renderDivs $ UserDemographics <$> 
    pure uid <*> 
    areq yearField "Year of birth" Nothing <*> 
    areq textField "Gender" Nothing <*> 
    areq countryField "Country of residence" Nothing <*> 
    areq boolField "Are you a computer programmer?" Nothing 

Sur ma page d'accueil, j'utilise generateFormPost $ userForm (entityKey userEnt) pour faire un formulaire avec le UserId rempli Mais je veux gérer l'entrée avec AJAX, donc une Handler séparée obtient les résultats de la forme. L'autre gestionnaire n'a pas accès au UserId. Comment puis-je traiter le formulaire? J'ai essayé, ce qui jette une erreur:

postDemoFormR :: Handler RepJson 
postDemoFormR = do 
    ((formData, _), _) <- runFormPost $ userForm undefined 
    $(logDebug) $ pack $ show formData 
    return $ repJson() 

je pouvais changer le type de userForm à accepter Maybe UserId au lieu de simplement UserId ou faire un UserId faux pour l'appel à runFormPost mais deux d'entre eux sont hacks. Existe-t-il un moyen facile et propre de le faire?

Répondre

1

Vous pouvez utiliser un hiddenField, mais qui est presque certainement pas ce que vous voulez vraiment (tout utilisateur serait en mesure d'usurper l'UserId par juste présenter une valeur différente). En supposant que ce que vous essayez de faire est réellement de dire "qui est l'utilisateur actuel", vous auriez besoin d'un moyen de déterminer en toute sécurité dans votre gestionnaire AJAX (tels que requireAuthId).

+0

La solution 'requireAuthId' fonctionne dans mon cas particulier, merci! Dans le cas général, comme dans les sections Forms du livre, vous voulez dire 'form :: Maybe UserId -> Form Blog 'et utiliser quelque chose comme' peut-être hiddenField pure mbUid' pour le champ 'UserId', n'est-ce pas? Vous construisez donc un formulaire avec un champ pré-rempli sur la page HTML et un champ masqué le gestionnaire POST. –

+1

Oui, c'est vrai –