2008年5月28日水曜日

Grails WebAlbumを動かしてみる5

$ALBUM_HOME/grails-app/views/shared/_creators.gspの内容を見ると、ログインすれば”New Picture”のリンクが出てきそうなことが書いてあります。

<div class='nav'>
    <span class="menuButton"><g:link controller="user" class="create" action="create">New User</g:link></span>
    <wa:ifUser>
        <span class="menuButton"><g:link controller="album" class="create" action="create">New Album</g:link></span>
        <wa:ifUserHasAlbums>
            <span class="menuButton"><g:link controller="picture" class="create" action="create">New Picture</g:link></span>
        </wa:ifUserHasAlbums>
    </wa:ifUser>
</div>

”<wa:ifUser>”、”<wa:ifUserHasAlbums>”の定義は$ALBUM_HOME/grails-app/taglib/WebAlbumTagLib.groovyに記述されています。

static namespace = "wa"

def ifUser = { attrs, body ->
boolean valid = session.userId != null
if (attrs.not) {
valid = !valid
}
if (valid) {
out << body()
}
}

def ifUserHasAlbums = { attrs, body ->
boolean valid = session.albumsCount && session.albumsCount > 0
if (attrs.not) {
valid = !valid
}
if (valid) {
out << body()
}
}

”attr.not”は<wa:ifUser not="true">と書いた場合trueになるものです。”body()”はタグに囲まれた部分のことです。
アルバムを2つ持つ”jhl”でログインすると”New Picture”リンクが出てきます。
クリックしてみましょう。
表示された”Create Picture”画面に従って操作します。
”Show Album”画面に戻ってpaginatorを操作すると、エラーが出てしまいます。
$ALBUM_HOME/grails-app/view/album/show.gspのpaginator部分を次のように直しましょう。

<g:paginate 
    total="${paginateCount}" 
    controller="album" 
    action="show" 
    id="${album.id}" 
    max="2" />

2008年5月27日火曜日

Grails WebAlbumを動かしてみる4

”Show Album”画面に表示されるPictureの数を2にしてみましょう。
$ALBUM_HOME/grails-app/views/album/show.gspの72行目を次のように編集します。

<g:paginate total="${paginateCount}" max="2" />

$ALBUM_HOME/grails-app/controllers/AlbumController.groovyの19行目を次のように変更します。

return [ album : album,
pictureList: makeAlbumPictureList(album),
paginateCount: Picture.findAllByAlbum(album).size() ]

findAllBy*の記述で”Dynamic Method”という機構が利用できます。
$ALBUM_HOME/grails-app/controllers/AlbumController.groovyの178行目を次のように変更します。

prepareList()
params.max = 2
Picture.findAllByAlbum(album, params)

”Show Album”画面を再表示するとPictureの表示件数は2になっています。

Grails WebAlbumを動かしてみる3

Picture Listの表示件数を変えてみたいと思います。
$ALBUM_HOME/grails-app/views/picture/list.gspの46行目を次のように編集します。

<g:paginate total="${paginateCount}" max="4" />  

$ALBUM_HOME/grails-app/controllers/PictureController.groovyの234行目のあとに次のように1行加えます。

prepareList()
params.max = 4     ← 追加
def user = sessionUser()

Picture Listを再表示すると4件ずつの表示されるようになります。

2008年5月24日土曜日

Grails WebAlbumを動かしてみる2

トップページがどのように表示されるか詳しく見てみましょう。
$ALBUM_HOME/grails-app/conf/UrlMappings.groovyに次の記述があります。

"/" (controller: 'user', action: 'list')

これにより"/"へのリクエストが'user' controllerの'list' actionを起動します。
$ALBUM_HOME/grails-app/controllers/UserController.groovyを見ると次の記述があります。

def list = {
makeUserList()
}
  
  …
  
def makeUserList() {
prepareList()
[ list: User.list(params), paginateCount: User.count() ]
}

listクロージャがあって呼び出しをたどるとmakeUserList()でgspに渡すデータが記述されています。
データはGroovyのマップ型です。
「list」というキーで「User.list(params)」という値をマップにputしています。
Grailsの規約(conventions)ではactionとして登録されたクロージャの次はgspの処理が行われることになってます。
この場合に処理されるgspは次のファイルです。
$ALBUM_HOME/grails-app/views/user/list.gsp
内容を見ると${list}や${paginateCount}といった記述が見つかります。
これは先ほどのマップにputされた値を参照します。

         <g:each in="${list}" status="i" var="user">
      …
         <g:paginate total="${paginateCount}">

このようにしてトップページが表示されます。

2008年5月23日金曜日

Grails WebAlbumを動かしてみる1

Grails WebAlbum Tutorialをやってみましょう。
まずはこちらの手順に従ってGrailsをインストールしましょう。
次にGrailsWebAlbum.zipをダウンロードして展開しましょう。
展開されたWebAlbumディレクトリ(以下$ALBUM_HOMEと呼びます)に移動し次のコマンドを実行してまだ何も手を加えていない状態のWebAlbumを実行しましょう

grails run-app

「Server running. Browse to http://localhost:8080/…」と表示されるのでそれに従ってブラウザで「http://localhost:8080/」にアクセスしましょう。
※「WebAlbum」の部分は必要ありません
画面が表示されたら右上の「Name」「Password」欄にそれぞれ「jhl」「villafranca」と入力し「Log in」をクリックしましょう。