Yesodでサンプルを書いてみる
相変わらずYesodを触っていて、最近はサンプルを書いてみています。
YesodはフルスタックなRoR風Webフレームワークということなので、本来はscaffold使ってDBやソースコードを自動生成して編集していくのが作法なのでしょう。
でも本家サイトのサンプルは1ファイルで完結するものばかりですし、まずは手軽に試したいので、作法は置いておくことにしました。
ってことで実際のサンプル。
マスタメンテ風に、ユーザ一覧とユーザ情報詳細を表示するWebアプリを作ってみました。
{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell , MultiParamTypeClasses, OverloadedStrings #-} import Yesod import Data.List data User = User { aId::Integer ,aName::String } deriving (Show, Eq) data Users = Users { aUsers :: [User] } deriving (Show, Eq) instance Yesod Users where approot _ = "" mkYesod "Users" [parseRoutes| /users/index UsersR GET /user/#Integer UserR GET |] getUsers = do users <- getYesod us <- return $ aUsers users return us getUsersR :: Handler RepHtml getUsersR = do us <- getUsers defaultLayout [whamlet| <ul> $forall user <- us <li><a href="/user/#{aId user}">#{aName user} |] getUserR :: Integer -> Handler RepHtml getUserR pId = do us <- getUsers case (find (\u -> aId u == pId) us) of Just user -> defaultLayout [whamlet| #{aName user}<br/> <a href="/users/index">Back. |] Nothing -> defaultLayout [whamlet| Not found.<br/> <a href="/users/index">Back. |] main = do users <- return [ User { aId = 0, aName = "Jabara" } ,User { aId = 1, aName = "Kawano" } ,User { aId = 2, aName = "Jabaraster" } ,User { aId = 3, aName = "Tomo" } ,User { aId = 4, aName = "100012" } ] warpDebug 3000 $ Users users
流れとしては
- データを作る
- ルーティングを書く
- getXxxR関数を書く
といった感じのようです。
ここでは2つのデータを作成しています。
ユーザ情報であるUserと、その集合であるUsersです。
Usersは型クラスYesodのインスタンスにしています。こうすることでUsersはgetYesod関数でインスタンスを取得することが出来るようになるようです。
ちょっと分かってきた気がします。
今後は
- 入力フォームとチェック
- DBとの連携
- Ajax
- scaffoldによるファイルの分離
- developmentサーバによるサクサク開発
などを試していきたいです。