Yesod でアプリを作る 6
-
付与されたタグ:
- Haskell
CRUDのうちUpdateとDeleteの実装をする。config/routeに追加する。
/blog/post/edit/#PostId PostEditR GET POST /blog/post/delete/#PostId PostDeleteR GET
template/blog.hamlet にリンクを追加する。
<table border="1"> <tr><th>Name</th><th>Title</th><th>tim estamp</th><th>Action</th> $forall Entity postId post <- posts <tr> <td> #{postName post} <td> #{postTitle post} <td> #{show $ postCreatedAt post} <td> <a href=@{PostViewR postId} > Show <a href=@{PostEditR postId} > Edit <a href=@{PostDeleteR postId} > Delete
次に Handler/Blog.hs に次を追加する
getPostEditR :: PostId -> Handler RepHtml getPostEditR postId = do post <- runDB $ get404 postId (postWidget, enctype) <- generateFormPost $ postForm $ Just post defaultLayout $ do $(widgetFile "post_new")
ここでポイントなのがpostForm $ Just post の部分。postFormの部分を見るとフォームの各要素を取り出して埋めている。新規作成のときには postForm Nothing が呼ばれるので全て空っぽになる。
postPostEditR :: PostId -> Handler RepHtml postPostEditR postId = do ((res, postWidget), enctype) <- runFormPost $ postForm Nothing case res of FormSuccess post -> do runDB $ do _post <- get404 postId update postId [ PostName =. postName post , PostTitle =. postTitle post , PostContent =. postContent post] setMessage $ toHtml $ (postTitle post) <> "updated" redirect $ PostViewR postId _ -> defaultLayout $ do setTitle "Please corrrect your entry form" $(widgetFile "post_new")
get404を使って存在しない記事に対して更新をかけてないかチェックをする。そのあとupdateを使ってデータを更新。
getPostDeleteR :: PostId -> Handler RepHtml getPostDeleteR postId = do runDB $ do _post <- get404 postId delete postId redirect $ BlogR
やはり削除の前にget404でチェック。これで編集と削除ができるようになる。