首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在IHP表单中传递列表参数?

如何在IHP表单中传递列表参数?
EN

Stack Overflow用户
提问于 2020-09-13 20:07:42
回答 1查看 192关注 0票数 8

我正试图在IHP中使我的表单中的多项选择成为一部分。目前正在试图用视图中的多个复选框来解决这个问题。

代码语言:javascript
复制
renderIngredientSelection :: Ingredient -> Html
renderIngredientSelection ingredient = [hsx|
    <li>
        <input name="ingredients" type="checkbox" value={(get #name ingredient)} />{get #name ingredient}
    </li>
    |]

所以网络日志的浏览器工具说它正确地发送了这样的请求。

代码语言:javascript
复制
barcode=5555555555555&name=Pancake&ingredients=milk&ingredients=egg

但是在控制器中,param函数只捕获第一个ingredients参数。

有任何方法来捕捉控制器中的所有这些参数吗?我在网络日志中看到,创建了一个包含所有参数(包括两个ingredients参数)的元组列表。我如何访问它并将其映射到像["milk", "egg"]这样的列表中

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-14 06:28:29

可以使用allParams访问日志中看到的完整请求参数。

对于请求,如:

代码语言:javascript
复制
barcode=5555555555555&name=Pancake&ingredients=milk&ingredients=egg

我们可以这样使用allParams

代码语言:javascript
复制
action MyAction = do
    let ingredients = allParams
    -- ingredients = [("barcode",Just "5555555555555"),("name",Just "Pancake"),("ingredients",Just "milk"),("ingredients",Just "egg")]

我们仍然需要过滤这个列表才能返回成分值:

代码语言:javascript
复制
action MyAction = do
    let ingredients = allParams
        |> filter (\(paramName, paramValue) -> paramName == "ingredients")
    -- ingredients = [("ingredients",Just "milk"),("ingredients",Just "egg")]

现在,我们需要将这个键值映射到仅值。因为这个值是一个可能值(如Just "milk"),所以我们将使用mapMaybe而不是mapmapMaybe丢弃所有的Nothing值,并解压缩Just

代码语言:javascript
复制
action MyAction = do
    let ingredients = allParams
        |> filter (\(paramName, paramValue) -> paramName == "ingredients")
        |> mapMaybe (\(paramName, paramValue) -> paramValue)
    -- ingredients = ["milk", "ingredients"]

我们现在有[ByteString]了。我们所处理的大多数函数都期望使用Text而不是ByteString,因此让我们使用cs进行转换(cs是转换字符串的缩写)。

代码语言:javascript
复制
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上:

代码语言:javascript
复制
module Application.Helper.Controller
( ...
, paramList -- Don't forget the export :)
)

paramList name = allParams
        |> filter (\(paramName, paramValue) -> paramName == name)
        |> mapMaybe (\(paramName, paramValue) -> paramValue)
        |> map cs

然后在控制器中使用它,如:

代码语言:javascript
复制
action MyAction = do
    let ingredients = paramList "ingredients"

Application.Helper.Controller中的所有函数在我们的控制器中都是自动可用的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63875081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档