Yesod でアプリを作る 4
-
付与されたタグ:
- Haskell
CRUDやVENDと呼ばれる機能は順次実装していくが最初に新しく記事を投稿する機能を実装する。
config/routeに次のように行を追加する。
/blog/post/new PostNewR GET POST
yesodが次のようなエラーを出力することに注意。
[9 of 9] Compiling Application ( Application.hs, dist/build/Application.o ) Application.hs:28:1: Not in scope: `getPostNewR' Application.hs:28:1: Not in scope: `postPostNewR' Build failure, pausing...
getPostNewRとpostPostNewRが実装されてないことによるエラーである。これを実装していく。Handler/Blog.hsに次の関数を追加する。
import Data.Monoid import Data.Time -- (snip) postForm :: Maybe Post -> Form Post postForm p = renderDivs $ Post <$> areq textField "Name" (postName <$> p) <*> areq textField "Title" (postTitle <$> p) <*> areq nicHtmlField "Content" (postContent <$> p) <*> aformM (liftIO getCurrentTime) getPostNewR :: Handler RepHtml getPostNewR = do (postWidget, enctype) <- generateFormPost $ postForm Nothing defaultLayout $ do $(widgetFile "post_new") postPostNewR :: Handler RepHtml postPostNewR = do ((res,postWidget),enctype) <- runFormPost $ postForm Nothing case res of FormSuccess post -> do postId <- runDB $ insert post setMessage $ toHtml $ (postTitle post) <> " created" redirect $ BlogR _ -> defaultLayout $ do setTitle "Please correct your entry form" $(widgetFile "post_new")
template/post_new.hamlet を作成する。
<form method=post enctype=#{enctype}> ^{postWidget} <div> <input type=submit value="Post New Post">
template/blog.hamlet に記事の投稿画面へのリンクを追加する。
...
...
<a href=@{PostNewR} >Post New
となる。ここまでできたら記事の投稿ができるようになる。 http://localhost:3000/blog に戻って Post New のリンクを辿って新しい記事を作成する。作成すると記事の一覧に追加されていくのを確認する。一覧だけでは寂しいので次は記事の中身を閲覧する(View)機能を追加する。