我正试图在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"]这样的列表中
发布于 2020-09-14 06:28:29
可以使用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然后在控制器中使用它,如:
action MyAction = do
let ingredients = paramList "ingredients"Application.Helper.Controller中的所有函数在我们的控制器中都是自动可用的。
https://stackoverflow.com/questions/63875081
复制相似问题