2016-07-06 2 views
0

У меня есть следующий вид:.Как обработать параметризованную форму Yesod из обработчика, где параметр недоступен?

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 

На моей странице, я использую generateFormPost $ userForm (entityKey userEnt) сделать форму с UserId залитого Но я хочу, чтобы обрабатывать входной сигнал с помощью AJAX, поэтому отдельное Handler получает результаты форма. Другой обработчик не имеет доступа к UserId. Как обрабатывать форму? Я попробовал это, который выдает ошибку:

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

Я мог бы изменить тип userForm «s принять Maybe UserId вместо просто UserId или сделать поддельную UserId для вызова runFormPost но оба тех писаки. Есть ли простой, чистый способ сделать это?

ответ

1

Вы можете использовать hiddenField, но это почти наверняка не то, что вы действительно хотите (любой пользователь сможет подменить UserId, просто подав другое значение). Предполагая, что вы пытаетесь сделать, на самом деле говорите «кто является текущим пользователем», вам нужно каким-то образом безопасно определить это в вашем обработчике AJAX (например, requireAuthId).

+0

Решение 'requireAuthId' работает в моем конкретном случае, спасибо! В общем случае, как и в разделах «Формы» книги, вы имеете в виду «form :: Maybe UserId -> Form Blog' и использовать что-то вроде« возможно, hiddenField pure mbUid »для поля UserId? Таким образом, вы должны создать форму с предварительно заполненным полем на странице HTML, а скрытое поле - обработчиком POST. –

+1

Да, это правильно –

Смежные вопросы