4

ちょっとした趣味アプリを書いています。さて、私のアプリケーションでは、ユーザーに userId を持たせたいと思っています (私がスタック オーバーフローでここにいるのと同じように)。それが既に取得されている場合は、ユーザーが別のユーザーを選択できるようにエラーが発生するようにします。

ここに私の Signup オブジェクトが続きます。「mapping(」: "オブジェクト Forms のメソッド マッピングの引数がありません。部分的に適用された関数として扱いたい場合は、このメソッドの後に `_' を付けてください" という行でエラーが表示されます。

object Signup extends Controller {

  val userForm: Form[UserProfile] = Form(
    mapping(
      "userId" -> nonEmptyText,
      "passwordHash" -> nonEmptyText,
      "email" -> email
    ) verifying (
      "ThisIsATest", { case(userId, passwordHash, email) => true }
      // "UserID already taken", { DBService.exists(UserProfile.getClass().getName(), userId) }
      )(UserProfile.apply)(UserProfile.unapply))


  def index = Action {

    Ok(views.html.signup(userForm))
  }

  def register = Action { implicit request =>
    userForm.bindFromRequest.fold(
      errors => BadRequest(views.html.signup(errors)),
      user => Redirect(routes.Profile.index))
  }
}

ご覧のとおり、ルックアップ サービスを単純​​に true を返すテスト検証に置き換えて、例の複雑さを軽減しています。完全を期すために、これは私の UserDetail ケース クラスです。

case class UserProfile(
                   userId : String,
                   email: String,
                   passwordHash: String)

私は Scala 初心者で Play 初心者なので、これが非常に些細な質問でしたら申し訳ありません。しかし:

  1. このエラーが発生したため、何が間違っていますか?

  2. これは、独自の検証を追加する正しい方法ですか?

  3. フォローアップの質問: うまくいけばリダイレクトしますが、確認したばかりのフォームを参照するページにリダイレクトするにはどうすればよいですか?

乾杯

ニック

4

3 に答える 3

5

最後にこれを回避しました。検証はマッピングの後に行われるものではなく、制約に基づいて行われるものです。だからそれは

"userId" -> nonEmptyText.verifying( "UserID already taken", userId => DBService.exists(UserProfile.getClass().getName().replace("$", ""), userId) == false ),

これが同じ問題を抱えている他の人に役立つことを願っています:-)

于 2012-06-06T09:59:15.503 に答える
4

ちょっと遅いけどとにかく..

最終的に単一のフィールドだけでなく、「フォームバッキングオブジェクト」全体で検証を行うことができます。これは、問題の説明に投稿した最初のコードに似ています。問題は、検証ブロックが適用/適用解除ステートメントの後にある必要があることです。

case class UserRegistration(username: String, password1: String, password2: String)

val loginForm = Form(
  mapping(
    "username" -> email,
    "password1" -> text,
    "password2" -> text
  )
  (UserRegistration.apply)(UserRegistration.unapply)
  verifying ("Passwords must match", f => f.password1 == f.password2)
)
于 2012-09-21T12:50:07.780 に答える
0

さらに後で、とにかく... :)

「フォームバッキングオブジェクト」全体で検証を使用しても、フォームの個々のフィールドにエラーを追加することはできません。そうしたい場合は、Play!を参照してください。フレームワーク 2.0: 他のフィールドを使用してフォームのフィールドを検証する

于 2013-11-09T23:02:26.473 に答える