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として取り出すことができるのです。