2015-05-29 87 views
0

我想创建一个子网站后的方法来创建一个新的实体,我有这个可保存格式使用runDB在子网站耶索德

demoForm :: RenderMessage master FormMessage => Maybe Demo -> AForm (HandlerT master IO) Demo 
demoForm demo = Demo 
      <$> areq textField (fieldSettingsLabel ("fieldone"::T.Text)) (demoFieldOne <$> demo) 
      <*> areq intField (fieldSettingsLabel ("fieldone"::T.Text)) (demoFieldTwo <$> demo) 
      <*> areq boolField (fieldSettingsLabel ("fieldThree"::T.Text)) (demoFieldThree <$> demo) 
      <*> areq dayField (fieldSettingsLabel ("fieldFour"::T.Text)) (demoFieldFour <$> demo) 

和Post方法:

postDemoNewR :: (Yesod master,RenderMessage master FormMessage) => HandlerT DemoCrud (HandlerT master IO) Html 
    postDemoNewR = do 
      tp <- getRouteToParent 
      ((result,widget), encoding) <- lift $ runFormPost $ renderBootstrap3 BootstrapBasicForm $ demoForm Nothing 
      case result of 
       FormSuccess demo -> do 

          _ <- lift $ runDB $ insert demo 
          redirect DemoNewR 
       _ -> lift $ defaultLayout $ do 
       let actionR = DemoNewR     
       [whamlet| 
        <form method=post [email protected]{tp DemoNewR} encType=#{encoding}> 
          ^{widget} 
        <button .btn .btn-default> default text create 
       |] 

,但有以下错误

Could not deduce (YesodPersistBackend master 
        ~ persistent-2.1.3:Database.Persist.Sql.Types.SqlBackend) 
from the context (Yesod master, RenderMessage master FormMessage) 
    bound by the type signature for 
      postDemoNewR :: (Yesod master, RenderMessage master FormMessage) => 

我的事情,我需要补充YesodPersist但我不知道如何

回答

0

您需要将以下约束添加到postDemoNewR声明:

YesodPersist master => YesodPersistBackend master ~ SqlBackend => … 

第一个约束告诉master而第二约束告诉用于持续性应该是一个SQL后端的后端必须有持续性的能力。

You can find something similar in this other question

+0

太棒了,它的工作原理!感谢!我需要修改YesodDispatch,以及'实例(耶索德主,RenderMessage主FormMessage,YesodPersist主,YesodPersistBackend主〜SqlBackend) => YesodSubDispatch DemoCrud(HandlerT主IO) 其中 yesodSubDispatch = $(mkYesodSubDispatch resourcesDemoCrud)' – oriaj