IHP中HSX转blaze-html时如何正确将PostsAction传入A.href
正确写法(符合IHP惯用法)
你应该使用IHP内置的pathTo函数将Action转换为对应的URL路径,再通过blaze提供的textValue函数转换为A.href接受的AttributeValue类型,这是官方推荐的标准方案:
H.a ! A.href (textValue $ pathTo PostsAction) $ "Posts"
如果当前环境未导入textValue,在导入段增加以下导入即可:
import Text.Blaze (textValue)
报错原因说明
- 第一次报错是因为
PostsAction是控制器类型,直接传入A.href时与预期的AttributeValue类型不匹配。 - 第二次报错是因为IHP默认的
show函数返回Text类型,而fromString要求输入String(即[Char])类型,二者类型不匹配。如果要临时修复该写法,可通过unpack将Text转为String:
-- 不推荐,仅用于解释错误原理 A.href (fromString . unpack $ show PostsAction)
该方式不建议在生产代码使用,因为show输出的内容仅用于调试,不保证和实际路由路径一致,pathTo才是生成路由的标准API。
完整修改后的代码
instance View EditView where html EditView { .. } = do H.nav $ do H.ol ! A.class_ "breadcrumb" $ do H.li ! A.class_ "breadcrumb-item" $ do H.a ! A.href (textValue $ pathTo PostsAction) $ "Posts" H.li ! A.class_ "breadcrumb-item active" $ "Edit Post" H.h1 "Edit Post" renderForm post
内容的提问来源于stack exchange,提问作者dharmatech
相关产品推荐
相关产品推荐

