CodeZine(コードジン)

特集ページ一覧

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

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

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

目次

addアクションの作成

 続いて、BoardsControllerにaddを追加しましょう。これは次のようになります。

def add = {
	if (request.getMethod() == 'POST'){
		def board = new Boards(params)
		if (!board.hasErrors()){
			board.save()
		}
		redirect(action:index)
	}
}

 実際に作成したところで、boards/addにアクセスし、フォームを送信してみてください。送信した内容がテーブルに追加され、indexの一覧リストに表示されます。

図7:boards/addにアクセスすると、レコードの作成フォームが現れる。
図7:boards/addにアクセスすると、レコードの作成フォームが現れる。
図8:投稿した内容は、新しいレコードとして追加される。
図8:投稿した内容は、新しいレコードとして追加される。

 ここでは、POSTで送られてきているかどうかをチェックし、それによってレコードの追加処理を実行するようにしています。まず「POSTされたかどうかチェックする」には、request.getMethod()というものを使っています。このrequestというオブジェクトは、リクエストに関する情報を管理するオブジェクトです(実をいえば、これは HttpServletRequestのインスタンスです)。ここからgetMethodで送られたmethod名を取得しているのです。

 さて、肝心のレコードの作成と保存ですが、これは非常に簡単です。まず、new BoardsでBoardsインスタンスを作成します。このとき、それぞれのフィールドの値をマップにまとめたものを引数に渡せば、それらの値を持つレコードのインスタンスができあがります。ここで、「なぜadd.gspのフォームで、各フィールド名と同じ名前の項目を用意したか」がわかったでしょう。こうすれば、ただparamsを引数に渡すだけで新しいレコードのインスタンスが用意できるのです。

 そして作成したインスタンスをデータベースに保存するには、saveメソッドを呼び出すだけです。ただし、その際にはhasErrorsというものをチェックしています。これはインスタンス生成時に何らかのエラーが発生していないかを調べるもので、問題なくインスタンスが用意できていたらsaveで保存するようにしています。

レコードの更新

 続いて、レコードの更新処理を考えましょう。更新処理は、アクセスした際に、どのレコードを編集するのかという情報が受け渡されていなければいけません。また、編集用のフォームを表示する際には、現在の値が各項目に表示された方が便利です。ということは、「アクセスする→編集するレコードのIDを受け取る→そのレコードを取り出す→フォームにレコードの内容を設定して表示する」というような流れとなるわけです。もちろん、フォームを送信すれば、そのIDのレコードの内容を更新しなければいけません。意外と複雑なのです。

 では、ビューから作成しましょう。ここでは「views」内の「boards」内に、新たに「edit.gsp」というファイルを作成し、ここに次のようなソースコードを記述することにします(ボディ部のみ掲載します。ヘッダー他はindexと同様です)。

<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><g:textField name="name" value="${board.name}"/></td>
		</tr>
		<tr>
		<td>TITLE</td>
		<td><g:textField name="title" value="${board.title}"/></td>
		</tr>
		<tr>
		<td>CONTENT</td>
		<td><g:textArea name="content" cols="20" rows="2"
			value="${board.content}" /></td>
		</tr>
		<tr><td></td>
		<td><g:actionSubmit value="UPDATE" action="edit"/></td>
		</tr>
	</table>
	</g:form>
</body>

 ここでは、コントローラー側で、編集するレコードの情報がboardという変数として渡されると想定して作成しています。IDおよびIDを保管する非表示フィールド、NAME,TITLE,CONTENTのそれぞれの項目のvalueにboard内の値を設定し、それぞれの値が最初からフォームの項目に表示されるようにしているのです。

editアクションの作成

 続いて、editアクションの処理をコントローラーに用意しましょう。ここでは、IDの値が送られてきているかどうかをチェックし、更にPOSTされたかどうかを調べて処理を分岐しています。

def edit = {
	if (params.id == null){
		redirect(action:index)
	}
	def board = Boards.get(params.id)
	if (request.getMethod() == 'POST'){
		board.properties = params
		if (!board.hasErrors()){
			board.save()
		}
		redirect(action:index)
	} else {
		[board:board]
	}
}

 説明は後にして、とりあえずできあがったら、「http://localhost:8080/gapp/boards/edit?id=1」にブラウザからアクセスをしてみましょう。これで、IDが1のレコードが編集できるようになります。

 URLにあるフォームでは、ID=1のレコードの内容があらかじめ設定された状態で表示されます(IDだけは編集できません)。ここで内容を変更して送信すると、そのレコードが更新されます。編集するIDは、URLの末尾に「edit?id=番号」という形で記述して送信をします。

図9:editに、id=1というようにパラメータを付加してアクセスすると、そのID番号のレコードを編集するフォームが現れる。
図9:editに、id=1というようにパラメータを付加してアクセスすると、そのID番号のレコードを編集するフォームが現れる。

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

バックナンバー

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

もっと読む

著者プロフィール

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

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

あなたにオススメ

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