libro
www.tuyano.com
初心者のためのPlay Framework入門

フォームヘルパーを活用しよう![Scala編] (3/5)

作成:2013-02-03 20:52
更新:2013-02-03 20:52

■コントローラーを実装する

では、先ほどのindex.scala.htmlを利用するコントローラークラスを下に掲載しておきましょう。これは、アプリケーションのルート(/)にアクセスし、フォームを送信すると、/sendformに送信され、そこでフォームの内容を取り出しメッセージとして表示を行います。

では、先に説明した流れにそって、コードをチェックしていきましょう。

1. 管理クラスの定義
case class MyFormData
    (name:String, mail:String)

ここでは、「MyFormData」というクラスとして定義しています。値として、String型のnamemailがありますね。先のビューテンプレートで、2つのinputTextで入力フィールドのタグを書き出していたのを思い出してください。このとき、こんな形でタグを生成していました。
@helper.inputText(myForm("name"))
@helper.inputText(myForm("mail"))
Formの「name」と「mail」を引数に指定してinputTextを呼び出していました。このように、「name」「mail」という名前でフォームに値が保管されることがわかります。MyFormDataクラスにも、それに合わせた名前で変数が用意されるのです。

2. Formインスタンスの用意
val form1 = Form(
    mapping(
        "name" -> text,
        "mail" -> text
    )(MyFormData.apply)(MyFormData.unapply)
)
Formインスタンスでは、引数に「mapping(……)」というものを用意しました。このmappingでは、それぞれの保管する値の名前とその種類が()に記述されています。"name" -> text, "mail" -> text というように書かれていますね。

3. アクションでのフォーム処理
def sendform = Action { implicit request =>
    var myForm = form1.bindFromRequest
    val data: MyFormData = myForm.get
    val title = "サンプルページ"
    val msg = "名前:" + data.name + ", メール:" + data.mail
    Ok(views.html.index(title, msg, myForm))
}
ここでは、フォーム送信した先のsendformアクションメソッドをチェックしておきましょう。まず、bindFromRequestを使ってform1にリクエストの値を組み込んだものを変数myFormに代入しています。そして、getで関連付けてあるMyFormDataインスタンスを取り出して変数dataに代入します。これで、フォームとそこに書かれた値のそれぞれがオブジェクトとして取り出せたわけです。

ここでは、取り出した値の利用例として、val msg = "名前:" + data.name + ", メール:" + data.mail というようにnamemailの値を使ったメッセージを作成し表示しています。case classで定義しているため、namemailといったGetterメソッドが自動的に作成されており、こんな具合にdata.nameとしてname値を取り出すことができるのです。

また、views.html.indexでは変数myFormを引数に渡しています。index.scala.htmlに用意されていた変数宣言を思い出してみましょう。こうなっていました。
myForm: Form[Application.MyFormData]
myFormは、Formインスタンス(form1)に値を組み込んだものです。[]には、Application.MyFormDataという指定がされています。これで、MyFormDataクラスで値を保管するFormmyFormに代入される、ということを示しているのですね。

――実際に書いてみるとわかるように、ビューテンプレートとコントローラーでフォームに関する内容が密接に関連付けられていることがよくわかります。両者の構造と名前付けがしっかりできていれば、それほど難しいことはありません。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

package controllers

import play.api._
import play.api.mvc._
import play.api.data.Form
import play.api.data.Forms._

object Application extends Controller {
    
    case class MyFormData(name:String, mail:String)
    val form1 = Form(
        mapping(
            "name" -> text,
            "mail" -> text
        )(MyFormData.apply)(MyFormData.unapply)
    )
    
    def index = Action {
        val title = "サンプルページ"
        val msg = "サンプルのページです。"
        Ok(views.html.index(title, msg, form1))
    }
    
    def sendform = Action { implicit request =>
        var myForm = form1.bindFromRequest
        val data: MyFormData = myForm.get
        val title = "サンプルページ"
        val msg = "名前:" + data.name + ", メール:" + data.mail
        Ok(views.html.index(title, msg, myForm))
    }
}

※関連コンテンツ

「初心者のためのPlay Framework入門」に戻る