如何在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
相关产品推荐
相关产品推荐

