CodeZine(コードジン)

特集ページ一覧

Grailsでデータベースを利用しよう

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/05/18 14:00

目次

データベースのレコードを取得する

 とりあえずデータベースの内容を編集するなどの管理機能が必要となるときは、このscaffoldが十分な機能を提供してくれることが分かりました。しかし、実際にアプリケーション内でデータベースを利用するには、プログラム内からデータベースにアクセスする方法を理解しておかなければいけません。

 まずは、データベースからレコードの一覧を取得し、表示することからやってみましょう。これはindexアクションに実装することにします。BoardsControllerを次のように修正しましょう。

class BoardsController {
	
	def index = {
		[tableData: Boards.list()]
	}
}

 scaffoldは使わないため、先に記述したscaffoldプロパティは削除します。そして、indexにレコード一覧を取得する処理を記述します。といっても、書いてあるのはわずか1行にすぎません。

 レコード一覧の取得は、ドメインクラスにある「list」メソッドを呼び出すだけです。Grailsでは、コントローラーからドメインクラス名をてそのまま指定し利用できるようになっています。ここではBoardsクラスとしてドメインクラスが用意されていますから、Boards.list()とすればBOARDSテーブルのレコード一覧が取り出せてしまうのです。これをtableDataに設定してビューに渡せば、後はビュー側でtableDataの値を取り出し、出力させていくだけです。

テーブルを表示する

 では、ビューを作成しましょう。「views」内に「boards」というフォルダが自動生成されて言るはずなので、この中に「index.gsp」というファイルを作成し、次のように記述します(文字コードをUTF-8にするのを忘れずに)。

<!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>Boards Index</title>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
		<style type="text/css">
			h1 {background:#AAAAFF; font-size: 12pt; padding: 3px;}
			h2{font-size: 12pt; font-weight: bold;}
			p{color:#000066; 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 Boards</h1>
		<h2>テーブルの一覧リスト</h2>
		<table>
			<g:each in="${tableData}" status="i" var="record">
				<tr>
					<td>${record.id}</td>
					<td>${record.name}</td>
					<td>${record.title}</td>
				</tr>
			</g:each>
		</table>
	</body>
</html>

 できあがったら、サーバを起動し、boards/indexにアクセスしてみましょう。登録したレコードの一覧が表示されます。

図6:boards/indexにアクセスすると、このようにレコードが一覧表示される。
図6:boards/indexにアクセスすると、このようにレコードが一覧表示される。

<g:each>による繰り返し処理

 このGSPでは、2つの重要なポイントがあります。1つ目は、「繰り返し処理のためのタグ」の使用です。ここでは、<g:each>というタグを使っています。これは、</g:each>までの部分を繰り返し出力する働きを持つもので、次のように記述をします。

繰り返し出力する
<g:each in="配列" status="変数" var="変数">
	……繰り返す内容……
</g:each>

 属性:

  • 「in」-配列データ。ここから順に値を取り出していきます。
  • 「status」-繰り返し回数を示すための変数を用意します。
  • 「var」-inで指定した配列から取り出した値がこれに設定されます。

 ここでは、Boards.listで取得したデータを変数に設定していました。この繰り返しにより、tableDataから1つずつレコードのデータが取り出され、変数recordに設定されるというわけです。

 では、取り出されたレコードデータから、各フィールドの値を取り出すにはどうするのか。これは非常に単純です。record.idというように、取り出すフィールド名を指定すればよいのです。レコードデータは、各フィールド名をキーとするマップの形になっています。従って、例えばIDの値を取り出したければ、record['id']またはrecord.idとすればよいのです。

レコードの追加

 続いて、新たにレコードを作成しテーブルに保存する処理を考えてみましょう。これはaddアクションとして用意します。まずは、ビューから用意しましょう。「views」内の「boards」内に「add.gsp」というファイルを新たに作成し、ボディ部分を次のように記述します(ヘッダーその他はindex.gspと同様でかまいませんが、<title>ぐらいは変えておくとよいでしょう)。

<body>
	<h1>Grails Boards</h1>
	<h2>レコードの追加</h2>
	<g:form controller="boards">
	<table>
		<tr>
			<td>NAME</td>
			<td><g:textField name="name" /></td>
		</tr>
		<tr>
			<td>TITLE</td>
			<td><g:textField name="title" /></td>
		</tr>
		<tr>
			<td>CONTENT</td>
			<td><g:textArea name="content" cols="20" rows="2" /></td>
		</tr>
		<tr><td></td>
			<td><g:actionSubmit value="CREATE" action="add"/></td>
		</tr>
	</table>
	</g:form>
</body>

 ここでは、boardsのaddに送信するフォームを1つ用意してあります。name、title、contentという名前の3つの入力項目が用意されています。これらの名前は、Boardsテーブルの各フィールドと同じになっていますが、これは重要です。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Groovy+GrailsでRailsなWeb開発

もっと読む

著者プロフィール

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

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

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5