背景關系
我有一個視圖,其中有一個由控制器動態生成的任意數量的輸入的表單。當表單被提交時,每個輸入都應該創建自己的記錄,因此,如果有60個輸入,就應該有60條記錄。問題
我們應該如何驗證每個輸入/欄位?在IHP檔案中的例子中,一個表單只創建了1條記錄,所以我不確定什么是最好的或習慣性的方法來做到這一點。也許我可以為每個提交的輸入映射一個類似以下的函式,但是左圖的情況將由第一個驗證失敗觸發,而不是所有的驗證失敗,所以我需要在重定向到前一個表單視圖之前將每個失敗保存在一個串列(?
action CreatePostAction = do
letpost = newRecord @Post
帖
|> 填寫@'["title"/span>, "body"/span>]
|> validateField #title nonEmpty
|> validateField #body nonEmpty
|> ifValid case
Left post -> render NewView { post }
Right post -> do
post <- post |> createRecord
setSuccessMessage "post created"。
重定向到PostsAction。
uj5u.com熱心網友回復:
嘗試這樣的方法:
action CreatePostAction = do
let titles :: [Text] = paramList "title"
let bodys :: [Text] = paramList "body">
let posts = zip titles bodys
|> map ((title, body) -> newRecord @Post
|> 設定#標題title
|> 設定#body主體
|> validateField #title nonEmpty
|> validateField #body nonEmpty
)
validatedPosts :: [Either Post Post] <- forM posts (ifValid (post -> pure post)
case Either.partitionEithers validatedPosts of
([], posts) -> do
創建許多帖子
setSuccessMessage "post created"。
重定向到PostsAction
(invalidPosts, validPosts) -> render NewView { posts }
為了讓它作業,你需要一個這樣的視圖:
module Web.View.Post.New where?
import Web.View.Prelude
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributesas A
data NewView = NewView { posts :: [Post] }
instance View NewView where
html NewView { ... } = [hsx|
<nav>
<ol class="breadcrumb"/span>>
<li class="breadcrumb-item"><a href={PostsAction}>Posts< /a> </li>
<li class="breadcrumb-item active">New Post< /li>
</ol>
</nav>
<h1>New Post</h1>
<form id="main-form" method="POST" action={CreatePostAction }>
<輸入 type="submit" class="btn btn-primary"/>
{forEach posts renderForm}。
</form>
|]
renderForm :: Post -> Html
renderForm post = [hsx|
<div class="form-group"/span>>
<標簽>。
Title
</label>
< 輸入 type="text" name="title" value={get #title post} class={classes ["form-control" 。("is-invalid", isInvalidTitle) ]}/>
{titleFeedback}
</div>
<div class="form-group"/span>>
<標簽>。
Body
</label>
< 輸入 type="text" name="body" value={get #body post} class={classes ["form-control" 。("is-invalid", isInvalidBody) ]}/>
{bodyFeedback}
</div>
|]
where
isInvalidTitle = isJust (getValidationFailure #title post)
isInvalidBody = isJust (getValidationFailure #body post)
titleFeedback = case getValidationFailure #title post ofJust result -> [hsx|<div class="invalid-feedback"/span>>{result}</div>|]
Nothing -> mempty
bodyFeedback = case getValidationFailure#body post of
Just result -> [hsx|<div class="invalid-feedback"/span>>{result}</div>|]
Nothing -> mempty
我的NewPostAction是這樣的:
action NewPostAction = do
let post = newRecord
let posts = take (paramOrDefault 2 "forms") $ repeat post
呈現 NewView { . }
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316913.html
標籤:
