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

