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

如何在Yesod的Hamlet模板中传递路由参数?

我来帮你搞定Yesod里路由参数传递的问题,其实逻辑很清晰,分两步就能解决:

1. 在Hamlet模板中传递路由参数

你的EditFooR路由定义需要一个Text类型的参数(对应路由里的#Text),所以在Hamlet里调用路由时,要像调用函数一样把参数传进去就行。

修改你的Hamlet代码,把@{EditFooR}改成@{EditFooR name}——这里的name就是你在getEditFooR Handler中拿到的那个参数,Yesod会自动把Handler里的变量注入到模板中:

<form method=post action=@{EditFooR name}#forms enctype=#{formEnctype}>
    ^{formWidget}
    <button type="submit">Submit

2. 配置POST路由并实现对应的Handler

你当前的路由只定义了GET方法,但表单用的是POST提交,所以首先要在config/routes里补充POST方法的路由条目:

foo/edit/#Text EditFooR GET POST

然后需要实现postEditFooR Handler来处理表单提交逻辑,它同样需要接收路由参数name,用来定位要编辑的资源:

postEditFooR :: T.Text -> Handler Html
postEditFooR name = do
    -- 先根据name找到要编辑的text资源
    text <- findTextByName name
    -- 处理POST提交的表单数据
    ((result, formWidget), formEnctype) <- runFormPost (editFooForm text)
    case result of
        FormSuccess updatedText -> do
            -- 这里写更新数据库的逻辑,比如把updatedText存回数据库
            -- updateFooText name updatedText
            -- 提交成功后重定向回编辑页面
            redirect (EditFooR name)
        _ -> do
            -- 表单验证失败,重新渲染带错误提示的表单
            defaultLayout $ do
                $(widgetFile "editFoo")

额外提醒

确保你的editFooForm函数是接受初始值参数的,比如:

editFooForm :: Text -> Html -> MForm Handler (FormResult Text, Widget)
editFooForm initialValue = renderDivs $ 
    areq textField "Foo内容" (Just initialValue)

这样整个流程就通了:GET请求加载编辑页面(带参数),POST请求提交修改(同样携带参数定位资源),模板里也能正确生成带参数的POST请求地址。

内容的提问来源于stack exchange,提问作者Justin Blank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:59:38