はじめに
前回、Boardsというテーブルを用意し、これを利用した簡単なサンプルを作成しました。このサンプルでは、レコードの表示・追加・更新・削除といった基本的な機能を作成しました。今回は、このサンプルをもとに、実用面で必要となる機能を実装しながらGrailsの持つ機能について説明をしていくことにしましょう。今回取り上げるのは、入力された値のチェックを行う「バリデーション」と、複数テーブルを結合し処理するために用意された「リレーションシップ」についてです。
対象読者
- JSPを書くのは正直しんどい……と近頃感じる人。
- Ruby on Railsスタイルの開発に興味があるという人。
- MVCフレームワークをJavaで学びたい、という人。
バリデーションについて
まずは、入力値のバリデーションについてです。例えば、新しいレコードを追加したり、レコードの編集をしたりするとき、フォームに値を記入して送信し、処理を行います。このとき、入力された値が期待通りの形になっているかどうか、それをチェックするのが「バリデーション」です。
通常は、送信された値を1つ1つチェックして正しく入力されているかどうかを確認していくわけですが、Grailsには最初からバリデーションのための仕組みが用意されており、簡単な設定を行うだけでバリデーションを行うことができます。では、やってみましょう。
constraintsの設定
前回、簡単なメッセージを登録する「Boards」というドメインクラスを作成しました。これは、次のように定義されていました。
class Boards { Long id String name String title String content static constraints = { } }
このとき、「このconstraintsというのはなんだろう?」と思った人もいたはずです。実をいえば、このconstraintsが、バリデーションの設定情報を管理するためのものだったのです。では、このconstraintsの値を次のように修正しましょう。
static constraints = { name(blank:false) title(blank:false) }
これは、nameとtitleに、それぞれ入力必須のバリデーションを設定したものです。設定内容については後に触れますが、このconstraintsの値は、次のような形で値を設定していきます。
static constraints = { 項目名(種類:値, 種類:値,……) ……項目が続く…… }
チェックする項目の後にあるカッコに、設定するバリデーションの種類と必要な値を記述していきます。name(blank:false)というのは、nameという項目に、blankという設定をfalseで設定する、という意味だったわけです。
コントローラーの修正
これで、Boardsドメインクラスに、バリデーションが設定されました。が、これだけではまだ不完全です。設定したバリデーションがきちんと機能するように、コントローラーを修正しましょう。ここでは、新たに項目を追加する「add」を次のように修正します。
def add = { if (request.getMethod() == 'POST'){ def board = new Boards(params) if (board.save()){ redirect(action:index) } else { board.errors.allErrors.each { println it.getField() // デバッグ用 } } } }
これで修正完了です。実際にaddにアクセスしてレコードを追加してみましょう。NAME,TITLEのどちらかが空のままだと、再度addの画面が表示されます。コマンドプロンプトなどの標準出力をチェックしていると、エラーの発生したフィールド名が出力されることを確認できます。