2016-07-06 26 views
0

Ich habe die folgende Form:.Wie verarbeite ich eine parametrisierte Yesod-Form von einem Handler, wo der Parameter nicht verfügbar ist?

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 

Auf meiner Homepage, ich generateFormPost $ userForm (entityKey userEnt) verwenden, um ein Formular mit den UserId ausgefüllt zu machen, aber ich mag die Eingabe mit AJAX zu handhaben, so dass ein separaten Handler bekommt die Ergebnisse die Form. Der andere Handler hat keinen Zugriff auf UserId. Wie bearbeite ich das Formular? Ich habe versucht, das, was einen Fehler auslöst:

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

Ich konnte userForm ‚s Typ verändern Maybe UserId statt nur zu akzeptieren UserId oder eine gefälschte UserId für den Anruf zu runFormPost bilden aber diese beiden sind Hacks. Gibt es einen einfachen, sauberen Weg, dies zu tun?

Antwort

1

könnten Sie ein hiddenField verwenden, aber das ist fast sicher nicht was Sie wirklich wollen (jeder Benutzer die UserId nur um zu fälschen wäre in der Lage, einen anderen Wert einreichen). Angenommen, Sie versuchen tatsächlich zu sagen, "wer ist der aktuelle Benutzer", benötigen Sie eine sichere Methode, um dies in Ihrem AJAX-Handler zu ermitteln (z. B. requireAuthId).

+0

Die 'requireAuthId' Lösung funktioniert in meinem speziellen Fall, danke! Es ist der allgemeine Fall, wie in den Forms-Abschnitten des Buches meinst du mit 'form :: Maybe UserId -> Form Blog' und mit etwas wie' vielleicht hiddenField pure mbUid' für das 'UserId'-Feld richtig? Sie würden also ein Formular mit einem vorgefüllten Feld auf der HTML-Seite und einem versteckten Feld, dem POST-Handler, erstellen. –

+1

Ja, das stimmt –