SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Groovy+GrailsでRailsなWeb開発

Grailsのバリデーションとリレーションシップ

Groovy+GrailsでRailsなWeb開発 第4回

  • X ポスト
  • このエントリーをはてなブックマークに追加

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>
図4 Commentsのaddアクションの表示。簡単なフォームを用意する。
図4 Commentsのaddアクションの表示。簡単なフォームを用意する。

 フォームの項目としては、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>
図5 Commentsのindexアクションの表示。核レコードでは、結合されているBoardsテーブルのタイトルも表示している。
図5 Commentsのindexアクションの表示。核レコードでは、結合されているBoardsテーブルのタイトルも表示している。

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

次のページ
Boardsのindex.gsp

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Groovy+GrailsでRailsなWeb開発連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3916 2009/05/27 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング