haskell - 如何在 IHP 表单中传递 List 参数?
问题描述
我正在尝试在 IHP 中的表格中进行多项选择。目前试图在视图中使用多个类似这样的复选框来解决它。
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
但在控制器中,该param
函数只会捕获第一个ingredients
参数。
有没有办法在控制器中捕获所有这些参数?我在网络日志中看到,创建了一个包含所有参数的元组列表,包括两个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]
现在。我们处理的大多数函数都期望 aText
而不是 a 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
然后像这样在控制器中使用它:
action MyAction = do
let ingredients = paramList "ingredients"
中的所有功能Application.Helper.Controller
都在我们的控制器中自动可用。
推荐阅读
- c - 比较 String if( "bonaparte"=="bonaparte" ) 这给出了真实的结果?
- rust - 结合 doctests 和 `extern crate`
- python - 从 kafka 主题打印 Pyspark 流数据
- javascript - ElectronJS:必须使用导入来加载 ES 模块
- python - 我想要(导入 youtube_dl)。所以我执行
但我不明白这个错误代码 - pytorch - 添加到权重矩阵 Pytorch
- php - 如何使用 socket.io 与后端 php websocket 反应本机客户端?
- c - 我认为下面的程序应该至少运行一次,因为条件为真,或者我弄错了。请赐教
- python - 将系列转换为 numpy 数组并将其与不同维度的数组连接起来
- 3d - Monogame + HLSL 鱼眼顶点着色器