RSS

Yesod でアプリを作る 4

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)機能を追加する。