即使定义了类型,IHP 中的 BadType 路由失败

BadType routing failure in IHP even though types are defined

上下文

我有一个字段类型为 Day 的记录(对应于我的 Postgresql 数据库中类型为 DATE 的字段)。我有一个工作正常的创建操作(记录保存到数据库中)。但是,如果我尝试从创建操作重定向到另一个操作并传入类型为 Day 的字段,例如:

-- PostsController.hs
action CreatePostAction = do
    let post = newRecord @Post
            post
                |> buildPost
                |> ifValid \case
                    Left post -> do
                        render NewView { .. }
                    Right post -> do
                        let date1 = get #date1 post
                        redirectTo SomeAction { .. }
                

我收到这个错误:

Query parameter "date1" needs to be a "UUID" but got "2021-10-16"

Routing failed with: BadType {expectedType = "UUID", value = Just "2021-10-23", field = "date1"}

即使 SomeAction 的参数类型是 Day:

-- Types.hs
data PostsController = SomeAction { date1 :: Day }

问题

为什么会抛出错误?为什么预期类型 UUID 应该是 Day?

IHP 的 AutoRoute 仅适用于以下数据类型:

  • 文字
  • [文字]
  • 也许是文本
  • 整数
  • [整数]
  • 可能是 Int
  • 编号

您可以在文档中找到更多详细信息:https://ihp.digitallyinduced.com/Guide/routing.html#parameter-types

我建议您使用 SomeAction { date1 :: Text } 作为解决方法。您也可以在没有任何显式参数的情况下使用 SomeAction,然后使用 param 访问日期,如下所示:

action SomeAction = do
    let date1 :: Day = param "date1"