CommentsControllerの作成
では、Commentsの内容を表示したりレコードを追加するため、コントローラーを作成しましょう。CommentsController.groovyに次のように記述をします。
class CommentsController {
def index = {
[tableData: Comments.list()]
}
def add = {
if (request.getMethod() == 'POST'){
def comment = new Comments(params)
comment.board = Boards.get(params.boards_id)
if (comment.save()){
redirect(action:index)
} else {
render(view:'add',model:[comment:comment])
}
}
}
}
ここでは、index、addの2つのアクションを用意しておきました。indexは、Comments.listの内容をtableDataとして渡すだけです。問題は、addでしょう。addでは、フォームから送信された情報をもとに、レコードを作成します。用意するフォームでは、NAMEとMESSAGEの他に、関連付けるBoardsレコードのID番号を「boards_id」として送るようにします。こうして送られたboards_idの値をもとにBoardsインスタンスを取得し、これをboardの値として設定してからsaveで保存すればいいわけです。
保存後の処理は、BoardsControllerのaddと同じです。saveがfalseでなければredirectしてindexに戻り、もしバリデーションエラーが起こってfalseが返されたなら、renderで再度addをロードし表示します。
add.gspの作成
では、ビューを作成しましょう。まずは、Commentsのadd.gspからです。基本的には、boardsのadd.gspと同じようにレコード登録のためのフォームを用意します。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Comments Add</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style type="text/css">
h1 {background:#AAFFAA; font-size: 12pt; padding: 3px;}
h2{font-size: 12pt; font-weight: bold;}
p{color:#006600; font-size:10pt;}
table{background: #CC6666;}
td{border-style:solid;border-width:2pt; border-color:#DDDDDD;
background-color:#FFFFFF;padding:2pt;}
</style>
</head>
<body>
<h1>Grails Comments</h1>
<h2>レコードの追加</h2>
<g:hasErrors bean="${comment}>
<g:renderErrors bean="${comment}" as="list" />
</g:hasErrors>
<g:form controller="comments">
<table>
<tr>
<td>BOARD ID</td>
<td><g:textField name="boards_id" /></td>
</tr>
<tr>
<td>NAME</td>
<td><g:textField name="name" /></td>
</tr>
<tr>
<td>MESSAGE</td>
<td><g:textArea name="message" cols="20" rows="2" /></td>
</tr>
<tr><td></td>
<td><g:actionSubmit value="CREATE" action="add"/></td>
</tr>
</table>
</g:form>
</body>
</html>

フォームの項目としては、BOARD ID、NAME、MESSAGEを用意します。ここから送信された内容が、先ほどのCommentsControllerのaddで処理されることになります。
Commentsのindex.gsp
これでようやく基本的な準備が整いました。では、いよいよテーブルの結合を使った表示を行いましょう。まずは、Commentsのindex.gspからです。ここでは、belongsToで関連付けられているBoardsレコードのタイトルを併せて表示させてみます。
<body>
<h1>Grails Comments</h1>
<h2>テーブルの一覧リスト</h2>
<table width="400">
<g:each in="${tableData}" status="i" var="record">
<tr>
<td>${record.id}</td>
<td>${record.name}</td>
<td>${record.message}</td>
<td>${record.board.title}</td>
</tr>
</g:each>
</table>
</body>

ヘッダー部分に大きな違いはないので、<body>タグ部分だけ掲載しておきます。実行すると、ID、名前、メッセージ、そして投稿した記事のタイトルが一覧表示されます。記事のタイトルを表示している部分を見ると、${record.board.title}という形になっていることが分かります。Commentsでは、結合されたBoardsを、boardとして保管していました。このため、Boardsに用意されているタイトルも、record.board.titleとして取り出すことができるのです。
