在 Yesod SubSite 中创建编辑操作
Posted
技术标签:
【中文标题】在 Yesod SubSite 中创建编辑操作【英文标题】:create edit operation in a Yesod SubSite 【发布时间】:2015-08-13 11:35:10 【问题描述】:我在 Yesod 的子站点中创建 CRUD 操作时遇到很多问题,我有以下路线
mkYesodSubData "DemoCrud" [parseRoutes|
/demoNew DemoNewR GET POST
/demoEdit/#DemoId DemoEditR GET POST
|]
和下面的 subDispach 实例
instance (Yesod master,RenderMessage master FormMessage, YesodPersist master, YesodPersistBackend master ~ SqlBackend)
=> YesodSubDispatch DemoCrud (HandlerT master IO)
where
yesodSubDispatch = $(mkYesodSubDispatch resourcesDemoCrud)
但是有这个错误
Couldn't match expected type ‘DemoId
-> HandlerT DemoCrud (HandlerT parent1 IO) a0’
with actual type ‘HandlerT DemoCrud (HandlerT master0 IO) html’
我正在搜索,但在页面示例中不要在路线中使用 Id
【问题讨论】:
也许有人有一个子站点中 Crud 操作的完整示例,可以帮助我很多 从提供的信息中很难判断,但我猜你在getDemoEditR
或postDemoEditR
上的类型签名错误。
谢谢你,你是对的我在 postDemoEditR 中有错误,
【参考方案1】:
Michael Snoyman 是对的,我在 postDemoEditR 中有错误,所以下面的代码是更正
getDemoEditR :: YesodPersist master
=> YesodPersistBackend master ~ SqlBackend
=> (Yesod master,RenderMessage master FormMessage)
=> DemoId -> HandlerT DemoCrud (HandlerT master IO) Html
getDemoEditR demoId = do
demo <- lift $ runDB $ get404 demoId
(widget, encoding) <- lift $ generateFormPost $ renderBootstrap3 BootstrapBasicForm $ demoForm (Just demo)
lift $ defaultLayout $ do
[whamlet|
<form method=post>
^widget
<div>
<input type=submit>
|]
postDemoEditR :: YesodPersist master
=> YesodPersistBackend master ~ SqlBackend
=> (Yesod master,RenderMessage master FormMessage)
=> DemoId -> HandlerT DemoCrud (HandlerT master IO) Html
postDemoEditR demoId = do
demo <- lift $ runDB $ get404 demoId
((result,widget), encoding) <- lift $ runFormPost $ renderBootstrap3 BootstrapBasicForm $ demoForm (Just demo)
case result of
FormSuccess demoResult -> do
_ <- lift $ runDB $ replace demoId demoResult
redirect DemoNewR
_ -> lift $ defaultLayout $ do
[whamlet|
<form method=post>
^widget
<div>
<input type=submit>
|]
【讨论】:
以上是关于在 Yesod SubSite 中创建编辑操作的主要内容,如果未能解决你的问题,请参考以下文章
Kendo UI - 如何在编辑时使特定字段只读,同时在剑道网格中创建可编辑?