Grails 0.5 13分間クッキング(その1)

まずは適当に作ってみよう。Grailsのインストールと環境設定(http://grails.codehaus.org/Japanese+Installation)は終わっているという前提で。

コマンドラインからWebアプリ(bookstoreという名前)を作成してカレントディレクトリを変更。

grails create-app bookstore
cd bookstore

次にドメインクラス、コントローラを作成。

grails create-domain-class Book
grails create-domain-class Author
grails create-domain-class Publisher

grails create-controller Book
grails create-controller Author
grails create-controller Publisher

grails-app/controllersにBookController.groovy、AuthorController.groovy、PublisherController.groovyという3つのファイル(コントローラ)があるのでこれを変更。例えば、BookController.groovyは、

class BookController {
def scaffold = true
}

のように、def scaffold = trueだけにする。残りの2つのファイルも同様に変更する。
次にgrails-app/domainにBook.groovy、Author.groovy、Publisher.groovyという3つのファイル(ドメインクラス)があるのでこれを以下のように変更。

Book.groovy

import java.util.*;

class Book { 
	static belongsTo = [ Author, Publisher ];
	static nullable = [ "published" ];
	String isbn;
	String title;
	Author author;
	Publisher publisher;
	Date published;
}	

Author.groovy

class Author { 
	static hasMany = [ books : Book ];
	String name;
}	

Publisher.groovy

class Publisher { 
	static hasMany = [ books : Book ];
	String name;
}	

これでOK。コマンドラインから

grails run-app

で起動。http://localhost:8080/bookstore でアクセスしてみるとちゃんと動作している。
ただこのままだとBookの登録時にAuthorとかPublisherのプルダウンが「Author:1」とか、「Publisher:1」とかになってかっこ悪いなあ。
で、grails generate-views Book とかやってみる。できたビュー(grails-app/views/book/show.gspとか)をみてみると、こんな箇所が。

<g:link controller="publisher" action="show" id="${book?.publisher?.id}">${book?.publisher}</g:link>

むう、これはtoString()をいじってやれば良いと見た。で、Publisher.groovyとAuthor.groovyに入れてみる。Book.groovyでは、nameじゃなくてtitleをreturn。

String toString() { name }

これで、かっこよくなった。「同じ名前だとわからないだろ」とかは言っちゃダメ。