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

流れとしては

  1. データを作る
  2. ルーティングを書く
  3. getXxxR関数を書く

といった感じのようです。

ここでは2つのデータを作成しています。
ユーザ情報であるUserと、その集合であるUsersです。

Usersは型クラスYesodのインスタンスにしています。こうすることでUsersはgetYesod関数でインスタンスを取得することが出来るようになるようです。

ちょっと分かってきた気がします。
今後は

  • 入力フォームとチェック
  • DBとの連携
  • Ajax
  • scaffoldによるファイルの分離
  • developmentサーバによるサクサク開発

などを試していきたいです。