では、コントローラー側の実装に進みましょう。コントローラー側は、フォームヘルパーによるフォームの処理をスムーズに行うため、けっこう細かな対応を行う必要があります。以下に整理していきましょう。
1. フォーム管理クラスの定義フォームから送信された情報は、後述しますが
Formというインスタンスとして渡されます。この
Formのままでは何かと使いにくいので、フォームから送信された値をまとめて管理するためのクラスを定義しておきます。
これは、コントローラークラス内に、以下のような形で定義を記述します。
case class クラス名 ( 値1, 値2, ……)
Javaでは、クラス定義は「
class クラス名」と書くのが基本でしたね。Scalaもそうなのですが、こんな具合に「
case class クラス名」という形でクラスを定義することもあります。普通のクラス定義と何が違うのかというと、このようにして定義すると、()に用意した引数の値ごとに、自動的に
Getterメソッドや
toString、
equalsなどの基本メソッドが組み込まれるようになっているのです。
これは、データを管理するためのクラスをささっと定義するときにはものすごく便利です。保管する値を()の引数に用意しておけば、自動的にそれらを扱うための基本的なメソッドを実装してくれるのですから。
2. Formインスタンスの用意フォームヘルパーから送られた情報は、
Formクラスのインスタンスとして扱うことができます。そのために、あらかじめ
Formインスタンスを用意しておきます。これは以下のような形で記述します。
変数 = Form( mapping( 各要素の定義 )(管理クラス.apply)(管理クラス.unapply) )
なんだか不思議な形を指定しますね。最初の
mapping( 各要素の定義 )というのは、送られたフォームのデータの構造を記すためのものです。これにより、何という名前のどういう値を保管する項目があるのかをきちんと指定しておくのですね。
その後の
(管理クラス.apply)(管理クラス.unapply)は、送られたフォームのデータのバインドに関する設定です。「
管理クラス」というのは、その前に
case classで定義したクラスです。このクラスを
applyすることで、
Formのデータを管理クラスのインスタンスとして持ち出せるようになります。
3. アクションでフォーム情報を取り出す以上の準備ができたら、アクションで送信されたフォームの情報を取り出し処理できるようになります。これはこんな形で行います。
def アクション = Action { implicit request =>
var変数 = <Formインスタンス>.bindFromRequest
val 変数2 =変数.get
最初の
implicit request =>により、リクエストを扱う
request変数が使えるようになります。これはフォーム利用アクションでは必須のものと考えておきましょう。
続いて、先に2で作成しておいた
Formインスタンスの「
bindFromRequest」メソッドを呼び出します。このメソッドは、
Formインスタンスにリクエストで渡される値を組み込んだものを作成し返します。これにより、変数にフォームの情報が書き込まれたインスタンスが得られるわけです。
そして、そのインスタンスの「
get」により、先に
(管理クラス.apply)で関連付けておいた管理クラスのインスタンスが取り出されます。このインスタンスに、フォームの値が全てまとめられている、というわけです。