フォームヘルパーを活用しよう![Scala編] (3/5)
作成:2013-02-03 20:52
更新:2013-02-03 20:52
更新:2013-02-03 20:52
■コントローラーを実装する
では、先ほどのindex.scala.htmlを利用するコントローラークラスを下に掲載しておきましょう。これは、アプリケーションのルート(/)にアクセスし、フォームを送信すると、/sendformに送信され、そこでフォームの内容を取り出しメッセージとして表示を行います。
では、先に説明した流れにそって、コードをチェックしていきましょう。
1. 管理クラスの定義
ここでは、「MyFormData」というクラスとして定義しています。値として、String型のnameとmailがありますね。先のビューテンプレートで、2つのinputTextで入力フィールドのタグを書き出していたのを思い出してください。このとき、こんな形でタグを生成していました。
2. Formインスタンスの用意
3. アクションでのフォーム処理
ここでは、取り出した値の利用例として、val msg = "名前:" + data.name + ", メール:" + data.mail というようにnameとmailの値を使ったメッセージを作成し表示しています。case classで定義しているため、nameやmailといったGetterメソッドが自動的に作成されており、こんな具合にdata.nameとしてname値を取り出すことができるのです。
また、views.html.indexでは変数myFormを引数に渡しています。index.scala.htmlに用意されていた変数宣言を思い出してみましょう。こうなっていました。
――実際に書いてみるとわかるように、ビューテンプレートとコントローラーでフォームに関する内容が密接に関連付けられていることがよくわかります。両者の構造と名前付けがしっかりできていれば、それほど難しいことはありません。
では、先に説明した流れにそって、コードをチェックしていきましょう。
1. 管理クラスの定義
case class MyFormData
(name:String, mail:String)
ここでは、「MyFormData」というクラスとして定義しています。値として、String型のnameとmailがありますね。先のビューテンプレートで、2つのinputTextで入力フィールドのタグを書き出していたのを思い出してください。このとき、こんな形でタグを生成していました。
@helper.inputText(myForm("name"))Formの「name」と「mail」を引数に指定してinputTextを呼び出していました。このように、「name」「mail」という名前でフォームに値が保管されることがわかります。MyFormDataクラスにも、それに合わせた名前で変数が用意されるのです。
@helper.inputText(myForm("mail"))
2. Formインスタンスの用意
val form1 = Form(Formインスタンスでは、引数に「mapping(……)」というものを用意しました。このmappingでは、それぞれの保管する値の名前とその種類が()に記述されています。"name" -> text, "mail" -> text というように書かれていますね。
mapping(
"name" -> text,
"mail" -> text
)(MyFormData.apply)(MyFormData.unapply)
)
3. アクションでのフォーム処理
def sendform = Action { implicit request =>ここでは、フォーム送信した先のsendformアクションメソッドをチェックしておきましょう。まず、bindFromRequestを使ってform1にリクエストの値を組み込んだものを変数myFormに代入しています。そして、getで関連付けてあるMyFormDataインスタンスを取り出して変数dataに代入します。これで、フォームとそこに書かれた値のそれぞれがオブジェクトとして取り出せたわけです。
var myForm = form1.bindFromRequest
val data: MyFormData = myForm.get
val title = "サンプルページ"
val msg = "名前:" + data.name + ", メール:" + data.mail
Ok(views.html.index(title, msg, myForm))
}
ここでは、取り出した値の利用例として、val msg = "名前:" + data.name + ", メール:" + data.mail というようにnameとmailの値を使ったメッセージを作成し表示しています。case classで定義しているため、nameやmailといったGetterメソッドが自動的に作成されており、こんな具合にdata.nameとしてname値を取り出すことができるのです。
また、views.html.indexでは変数myFormを引数に渡しています。index.scala.htmlに用意されていた変数宣言を思い出してみましょう。こうなっていました。
myForm: Form[Application.MyFormData]myFormは、Formインスタンス(form1)に値を組み込んだものです。[]には、Application.MyFormDataという指定がされています。これで、MyFormDataクラスで値を保管するFormがmyFormに代入される、ということを示しているのですね。
――実際に書いてみるとわかるように、ビューテンプレートとコントローラーでフォームに関する内容が密接に関連付けられていることがよくわかります。両者の構造と名前付けがしっかりできていれば、それほど難しいことはありません。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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)) } }
※関連コンテンツ