You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IHP框架出现AutoRoute推导错误,请求参数传递调试指导

IHP 传参错误解决及入门调试建议

错误1:Could not deduce (IHP.RouterSupport.AutoRoute (Id' "hardwareVendors"))(Web/View/HardwareVendors/Show.hs 第8行)

  • 这个错误核心是路由自动推导失败,通常是Action参数类型不符合IHP的AutoRoute规则:
    • 检查你的Action定义:确保HardwareVendorsShowAction的参数用IHP提供的Id HardwareVendor类型,而非内部构造器Id' "hardwareVendors"。正确示例:
      data HardwareVendorsShowAction = HardwareVendorsShowAction { hardwareVendorId :: Id HardwareVendor } deriving (Eq, Show, Data)
      
    • 查看View第8行的路由调用:如果是用pathTo生成链接,要传入完整的Action实例,比如pathTo (HardwareVendorsShowAction { hardwareVendorId = vendor.id }),不能直接传Id值。

错误2:变量app未在作用域

  • 这个问题是View中没有正确获取app上下文:
    • 检查View的类型定义:确保ShowView包含context字段,比如:
      data ShowView = ShowView { vendor :: HardwareVendor, context :: Context }
      
    • 确认Controller渲染View时传入了context:
      action HardwareVendorsShowAction { hardwareVendorId } = do
          vendor <- fetch hardwareVendorId
          render ShowView { vendor, context = context }
      
    • 模板中访问app时,用context ^. #app(需导入Control.Lens),或者通过get #app获取,避免直接写app。

IHP入门调试建议

  • 用开发模式实时排查:运行./start启动开发服务器,终端会输出完整的编译错误日志,比浏览器提示更详细,优先看终端信息。
  • 类型检查:用GHCi的:t命令查看变量/函数类型,比如:t hardwareVendorId,确认参数类型符合AutoRoute的要求。
  • 对比官方生成代码:用ihp-generate crud HardwareVendor生成标准CRUD代码,对照你的代码找差异,IHP的默认模板是最规范的参考。
  • 逐步简化代码:先写最基础的ShowAction和View(只显示一个字段),确认能正常运行后再添加复杂逻辑,缩小报错范围。
  • 定位作用域问题:遇到“未在作用域”错误时,直接跳转到报错行,检查变量是否在当前上下文中定义,比如app是否通过context传递,或者是否有拼写错误。

内容的提问来源于stack exchange,提问作者Geoff Langenderfer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:52:18