SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

Groovy+GrailsでRailsなWeb開発

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

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

レコードの取得と更新処理

 レコードの修正は、2段階で実行されます。第1段階では、アクセスしたときに送られたIDを元に、編集するレコードを取り出しビューに渡す、という処理です。第2段階は、送信されたフォームを元に、指定のIDのレコードを書き換えるという処理になります。

 まず第1段階の「指定したIDのレコードを取り出す」という部分を見てみましょう。これは、以下の文で行っています。

def board = Boards.get(params.id)

 ドメインクラスにある「get」は、引数で指定したIDのレコードを返す働きをします。これでレコードが変数boardに設定されました。後は、[board:board]というようにして、ビューに値を渡すだけです。意外と簡単です。

 続いて第2段階の「指定したIDのレコードを更新する」という処理です。これは、まずgetで更新するID番号のレコードを取得し、その内容を変更してから保存する、ということを行います。レコード内容の変更は、

board.properties = params

 たったこれだけです。「properties」は、そのドメインクラスに保管されている各フィールドの値を管理するプロパティです。ここに、送信されたフォームの内容をまとめたparamsを渡せば、値が新しいものに置き換わります(もちろん、フォーム側で各フィールドと同じ名前で項目を用意しているから可能になっています)。

 後は、「save」で保存するだけです。saveは、新たにレコードを追加する場合にも使いしたね。saveを実行すると、そのIDのレコードがなければ新たにレコードを追加し、既にそのIDのレコードが存在すれば、そのレコードの内容を更新するのです。

レコードの削除

 最後に、レコードの削除を作成しましょう。これは、先ほどの更新処理をアレンジします。IDを指定してアクセスすると、ページにそのIDのレコードが表示されます。そしてそのまま送信すると、そのIDのレコードが削除されるようにしましょう。

 まずは、ビューの作成です。「views」の「boards」内に「del.gsp」というファイルを作成し、次のようにフォームを用意します(ボディ以外は他のページと同様です)。

<body>
	<h1>Grails Boards</h1>
	<h2>レコードの削除</h2>
	<g:form controller="boards">
	<g:hiddenField name="id" value="${board.id}" />
	<table>
		<tr>
		<td>ID:</td>
		<td>${board.id}</td>
		</tr>
		<tr>
		<td>NAME</td>
		<td>${board.name}</td>
		</tr>
		<tr>
		<td>TITLE</td>
		<td>${board.title}</td>
		</tr>
		<tr>
		<td>CONTENT</td>
		<td>${board.content}</td>
		</tr>
		<tr><td></td>
		<td><g:actionSubmit value="DELETE" action="del"/></td>
		</tr>
	</table>
	</g:form>
</body>

 ここでは、フォームには非表示フィールドにIDの値を保管しているだけです。後は、コントローラーから渡されたboardの値をそれぞれのところに出力しています。

delアクションの作成

 では、コントローラーにdelアクションを作成しましょう。これは次のようになります。

def del = {
	if (params.id == null){
		redirect(action:index)
	}
	def board = Boards.get(params.id)
	if (request.getMethod() == 'POST'){
		board.delete()
		redirect(action:index)
	} else {
		[board:board]
	}
}

 先ほどのeditと同様に、「boards/del?id=番号」というようにアクセスすると、指定したID番号のレコードを削除するための画面が現れます。ここで内容を確認し、送信すると、そのレコードが削除されます。

 ここで行っているのは、「IDが送信されていない場合にはindexにリダイレクトする、IDが送られていてPOSTでない場合にはそのIDのレコードをgetしビューに渡す」というもの。この部分は先の更新処理とまったく同じです。

 違っているのは、POSTされたときにレコードの削除をする、という部分だけです。レコードの削除は、まず削除するレコードをgetで取得した後、「delete」メソッドを呼び出して行います。これで、現在読み込まれているレコードが削除されます。

図10:delに、id=1というようにパラメータを付加してアクセスすると、そのID番号のレコードが表示される。このままボタンを押して送信すると削除される。
図10:delに、id=1というようにパラメータを付加してアクセスすると、そのID番号のレコードが表示される。このままボタンを押して送信すると削除される。

まとめ

 以上で、データベースの基本処理となる「一覧表示」「新規追加」「更新」「削除」といった操作について一通りできるようになりました。これらの機能をアレンジすれば、ごくシンプルなデータベース利用のアプリケーションは作れるようになるでしょう。

 実際にやってみれば分かるように、Grailsのドメインを使ったデータベース操作は非常にシンプルです。ほとんどが、簡単なメソッドを呼び出すだけで行えます。これは、Grailsに内蔵されている「GORM(Grails Object Releational Mapping)」と呼ばれるO/Rマッピング機能のおかげです。Hibernate3を使って作られたGORMは、非常にシンプルなデータベースアクセス機能を提供してくれています。ドメインにあるメソッドを使ってデータベースを操作している限り、ほとんどデータベースとのやりとりや実行されるクエリーを意識することはないでしょう。

 データベースから気軽にレコードを持ってこれるようになると、作成できるアプリケーションの幅もぐっと広がります。ここで紹介した基本操作を使って、自分なりに簡単なアプリを考えてみましょう。思った以上に簡単に、データベースアクセスするWebアプリが作れることに驚くはずです。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Groovy+GrailsでRailsなWeb開発連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3868 2009/05/18 14:00

イベント

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

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

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

メールバックナンバー