gpt4 book ai didi

haskell - 如何在 IHP 表单中传递 List 参数?

转载 作者:行者123 更新时间:2023-12-02 02:42:29 28 4
gpt4 key购买 nike

我正在尝试在 IHP 中的表格中进行多项选择。目前试图在 View 中使用多个类似这样的复选框来解决它。

renderIngredientSelection :: Ingredient -> Html
renderIngredientSelection ingredient = [hsx|
<li>
<input name="ingredients" type="checkbox" value={(get #name ingredient)} />{get #name ingredient}
</li>
|]
所以网络日志的浏览器工具说它正在正确地发送这样的请求。
barcode=5555555555555&name=Pancake&ingredients=milk&ingredients=egg
但在 Controller 中, param函数只会捕获第一个 ingredients范围。
有没有办法在 Controller 中捕获所有这些参数?我在网络日志中看到,创建了一个包含所有参数的元组列表,包括 ingredients参数。我怎样才能访问它并将其映射到像 ["milk", "egg"] 这样的列表中? ?

最佳答案

您可以使用 allParams 访问您在日志中看到的完整请求参数。
对于像这样的请求:

barcode=5555555555555&name=Pancake&ingredients=milk&ingredients=egg
我们可以使用 allParams像这样:
action MyAction = do
let ingredients = allParams
-- ingredients = [("barcode",Just "5555555555555"),("name",Just "Pancake"),("ingredients",Just "milk"),("ingredients",Just "egg")]
我们仍然需要过滤此列表以仅返回成分值:
action MyAction = do
let ingredients = allParams
|> filter (\(paramName, paramValue) -> paramName == "ingredients")
-- ingredients = [("ingredients",Just "milk"),("ingredients",Just "egg")]
现在我们需要将此键值映射映射到值。因为该值是一个可能(如 Just "milk" ),我们将使用 mapMaybe而不是 map . mapMaybe扔掉所有的 Nothing值并解压缩 Just :
action MyAction = do
let ingredients = allParams
|> filter (\(paramName, paramValue) -> paramName == "ingredients")
|> mapMaybe (\(paramName, paramValue) -> paramValue)
-- ingredients = ["milk", "ingredients"]
我们有一个 [ByteString]现在。我们正在处理的大多数函数都期望 Text而不是 ByteString ,因此让我们使用 cs 进行转换(cs 是转换字符串的缩写):
action MyAction = do
let ingredients :: [Text] = allParams
|> filter (\(paramName, paramValue) -> paramName == "ingredients")
|> mapMaybe (\(paramName, paramValue) -> paramValue)
|> map cs
-- ingredients = ["milk", "ingredients"]
将其移至 Application/Controller/Helper.hs对于一个不错的代码结构,我会将这个函数移到 Application/Controller/Helper.hs像这样:
module Application.Helper.Controller
( ...
, paramList -- Don't forget the export :)
)

paramList name = allParams
|> filter (\(paramName, paramValue) -> paramName == name)
|> mapMaybe (\(paramName, paramValue) -> paramValue)
|> map cs
然后像这样在 Controller 中使用它:
action MyAction = do
let ingredients = paramList "ingredients"
Application.Helper.Controller中的所有功能在我们的 Controller 中自动可用。

关于haskell - 如何在 IHP 表单中传递 List 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63875081/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com