6

Play! は初めてで、既存の Web サイトを CakePHP から Play! に移行しようとしています。

私が直面している問題は、フォームの検証に関するものです。

私の Web サイトのユーザーを表すケース クラス User を定義しました。

case class User(
  val id: Long,
  val username: String,
  val password: String,
  val email: String
  val created: Date)

(さらにいくつかのフィールドがありますが、これらは私の問題を説明するのに十分です)

ユーザーがフォームを使用して私のウェブサイトでアカウントを作成できるようにしたいと考えています。また、このフォームが Play! によって検証されるようにしたいと考えています。

そこで、次のアクションを作成しました。

def register = Action {
  implicit request =>

    val userForm = Form(
      mapping(
        "id" -> longNumber,
        "username" -> nonEmptyText(8),
        "password" -> nonEmptyText(5),
        "email" -> email,
        "created" -> date)(User.apply)(User.unapply))

    val processedForm = userForm.bindFromRequest
    processedForm.fold(hasErrors => BadRequest("Invalid submission"), success => {
      Ok("Account registered.")
    })
}

明らかに、ユーザーが自分でフォームに ID や作成日を入力することは望ましくありません。だから私の質問は:私は何をすべきですか?

フォームで実際にユーザーに提供されるフィールドのみを含む新しい「遷移モデル」を定義し、この中間モデルをデータベースに挿入する前に完全なものに変換する必要がありますか?

つまり、私のアクションを次のようなものに置き換えます。

def register = Action {
  implicit request =>

    case class UserRegister(
      username: String,
      password: String,
      email: String)

    val userForm = Form(
      mapping(
        "username" -> nonEmptyText(8),
        "password" -> nonEmptyText(8),
        "email" -> email)(UserRegister.apply)(UserRegister.unapply)

    val processedForm = userForm.bindFromRequest
    processedForm.fold(hasErrors => BadRequest("Invalid submission"), success => {
      val user = User(nextID, success.username, success.password, success.email, new Date())
      // Register the user...
      Ok("Account created")
}

または、私がやりたいことを行うための別のよりクリーンな方法はありますか?

私は多くのチュートリアルと「Play for Scala」という本を読んできましたが、私が見つけた唯一の例では、モデルはフォームで完全に埋められていました... 私は Play が本当に好きです! これまでのところ、ドキュメントには例が欠けていることが多いようです...

ご回答ありがとうございます。

4

1 に答える 1