oriaj
oriaj

Reputation: 788

create edit operation in a Yesod SubSite

I'm having many problems to create the CRUD operation in a SubSite in Yesod, I have the following routes

mkYesodSubData "DemoCrud" [parseRoutes|
/demoNew DemoNewR GET POST
/demoEdit/#DemoId DemoEditR GET POST
|]

and the following subDispach instance

instance (Yesod master,RenderMessage master FormMessage, YesodPersist master, YesodPersistBackend master ~ SqlBackend) 
  => YesodSubDispatch DemoCrud (HandlerT master IO) 
  where
 yesodSubDispatch = $(mkYesodSubDispatch resourcesDemoCrud)

but have this error

Couldn't match expected type ‘DemoId
                              -> HandlerT DemoCrud (HandlerT parent1 IO) a0’
            with actual type ‘HandlerT DemoCrud (HandlerT master0 IO) Html’

I was search but in the page example don't use Id in the routes

Upvotes: 1

Views: 114

Answers (1)

oriaj
oriaj

Reputation: 788

Michael Snoyman are right, I had an error in postDemoEditR, so the following code is the correction

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>
                        |]  

Upvotes: 1

Related Questions