2015-01-28 4 views
2

Я пытаюсь создать страницу с несколькими подобными формами на одной странице. Каждая форма очень проста, она предоставляет целочисленный ввод и кнопку отправки. Каждая форма соответствует счетчику, и счетчик должен быть увеличен при отправке формы.Какая форма для запуска?

incrementCounterForm :: Entity Counter -> Form (CounterId, Int) 
incrementCounterForm (Entity i _) = renderBoostrap3 BootstrapInlineForm 
             $ (,) 
             <$> pure i 
             <*> areq intField "value" Nothing 

В моем обработчике GET я

counters <- runDB $ selectList [] [] -- Get all the current counters 
forms <- mapM (generateFormPost . incrementCounterForm) counters -- Generate the forms 

Тогда в моем хуторе файле я итерацию по формам и сделать их все по отдельности (все они идут в тот же обработчик).

Мой вопрос относится к обработчику POST. Как сделать runFormPost?

((result,_),_) <- runFormPost $ incrementCounterForm undefined 

Что должно быть undefined быть здесь? Я хочу получить счетчик из формы, не нужно ее предоставлять.

EDIT: Я солгал о предоставлении произвольного счетчика рабочего

Если я обеспечить произвольные Entity Counter это, кажется, работает (при условии, счетчик не используется в результате). Тем не менее, я не могу оставить его как undefined, потому что runFormPost, кажется, его оценивает.

+0

Я под ложным впечатлением, что 'pure' будет вставлять скрытое поле ввода? – Alpaca

+0

Действительно, изменение его с 'pure' на' isq hiddenField "" (Just i) 'заставляет его работать, если я предоставляю произвольное поле' Entity Counter'. Все еще не работает с неопределенным. – Alpaca

+0

Одним из подходов, которые вы можете предпринять, является перемещение идентификатора счетчика в URL-адрес. Я не уверен, как выглядит ваша текущая структура URL-адресов, но если вы можете использовать POST в/counters/1/increment или что-то еще, вам не нужно будет хранить идентификатор счетчика в скрытом поле. – MaxGabriel

ответ

0

Итак, я бы посоветовал переместить идентификатор вашего счетчика в URL-адрес, так что вы делаете что-то вроде POSTing to/counters/1/increment или что-то еще. Чувствует себя немного, чтобы иметь идентификатор в скрытом поле.

Однако, если вы хотите сохранить его в скрытом поле, вы можете получить форму в качестве аргумента Maybe (Entity Counter). То, что вы сделаете, - это когда пользователь ПОЛУЧИТ страницу, и вы создаете форму, вы передадите (Just entity) в качестве аргумента, который вы будете использовать для заполнения скрытого поля. Когда пользователь высылает вам POST и вы запустите форму, вы не укажете значения по умолчанию (потому что вы хотите, чтобы значение было сохранено в скрытом поле).

Вот пример того, что это будет выглядеть следующим образом:

data MyForm = MyForm 
    { increment :: Integer 
    , counterId :: CounterId 
    } 
    deriving Show 

myForm :: Maybe (Entity Counter) -> AForm Handler MyForm 
myForm maybeEntity = MyForm 
     <$> areq intField "How much to increment?" Nothing 
     <*> areq hiddenField "" (entityKey <$> maybeEntity) 

При создании формы, обеспечить значение для скрытого поля:

(widget, enctype) <- generateFormPost $ renderBootstrap (myForm (Just someEntity)) 

При запуске формы, не обеспечивают значение по умолчанию; скрытое поле должно содержать следующие данные:

((res, widget), enctype) <- runFormPost $ renderBootstrap (myForm Nothing) 
Смежные вопросы