LoginSignup
9
9

More than 5 years have passed since last update.

Play! framework のフォームを正規表現でバリデーションする

Posted at

Play! framework には、クエリ文字列などフォームの入力を処理するための仕組みがありますが、正規表現でチェックが可能です。公式ドキュメントに載ってなかったのでここで紹介します。

package controllers

import play.api._
import play.api.mvc._

import play.api.data._
import play.api.data.Forms._
import play.api.data.validation._

case class Hoge(hoge: String, fuga: Option[String])

object Application extends Controller {

  def index = Action { implicit request =>
    val form = Form(
      mapping(
        "hoge" -> text.verifying(Constraints.pattern("[a-z]+".r)),
        "fuga" -> optional(text.verifying(Constraints.pattern("(HOGE|FUGA|PIYO)".r)))
      )(Hoge.apply)(Hoge.unapply))
    form.bindFromRequest.fold(
      formWithErrors => BadRequest("error"),
      hoge => Ok(hoge.toString)
    )
  }
}

text.verifying に、Constraints.pattern(正規表現) を指定すると正規表現で verify してくれます。オプショナルな場合でも、optional(text.verifying...) と記述することで、省略可能な形でチェックしてくれます。

ちなみにユニットテストとしては以下のような感じになります。

package controllers

import org.specs2._
import specification._

import play.api.test._
import play.api.test.Helpers._

class ApplicationSpec extends script.Specification with Grouped {
  def is = s2"""
  + 正しいクエリ文字列を渡した場合、Ok になる
  + 間違ったクエリ文字列を渡した場合、BadRequest になる
  + オプションにも対応
"""

  "" - new group {
    eg := status(Application.index()(FakeRequest(GET, "/?hoge=abc"))) == OK
    eg := status(Application.index()(FakeRequest(GET, "/?hoge=ABC"))) == BAD_REQUEST
    eg := contentAsString(Application.index()(FakeRequest(GET, "/?hoge=abc&fuga=HOGE"))) == "Hoge(abc,Some(HOGE))"
  }
}

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9