RSS

Yesod でアプリを作る 6

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でチェック。これで編集と削除ができるようになる。