3

ScalaForms

ここにリンクされている例には、フォームの検証に関する次の例があります。

// You can also define ad-hoc constraints on the fields:
val loginForm = Form(
  tuple(
    "email" -> nonEmptyText,
    "password" -> text
  ) verifying("Invalid user name or password", fields => fields match { 
      case (e, p) => User.authenticate(e,p).isDefined 
  })
)

バインディングエラーを介して、いくつかの制約が私のフォームに表示されます。(のようにnonEmptyText、フィールドの後ろに余分な行が表示されますThis field is required。参照:

loginForm.bindFromRequest.fold(
  formWithErrors => // binding failure, you retrieve the form containing errors,
  value => // binding success, you get the actual value 
)

私がこれを行う.toStringと、制約formWithErrorsのためにこれを取得します:nonEmptyText

Form(ObjectMapping2(<function2>,<function1>,(Email adress,FieldMapping(,List(Constraint(Some(constraint.required),WrappedArray())))),(Password,FieldMapping(,List(Constraint(Some(constraint.required),WrappedArray())))),,List(Constraint(None,List()))),Map(Password -> test, Email adress -> ),List(FormError(Email adress,error.required,WrappedArray())),None)

後者の部分はFormErrorリストです。List(FormError(Email adress,error.required,WrappedArray())),None)これはケースクラスです。case class FormError (key: String, message: String, args: Seq[Any])ここで、keyは次のように定義されますThe error key (should be associated with a field using the same key).

FieldConstructorはこれを取得し、[メールアドレス]入力ボックスを赤くしてエラーメッセージを追加します([このフィールドは必須です])。

アドホック制約を表示しますか?

したがって、フォームフィールドがすべて入力されると、ユーザー名とパスワードがチェックされます。

verifying("Invalid user name or password", fields => fields match { 
      case (e, p) => User.authenticate(e,p).isDefined 
  })

しかし、「無効なユーザー名またはパスワード」をユーザーに表示する方法がわかりません。のリストは次のとおりです.toStringFormErrorformWithErrors

List(FormError(,Invalid user name or password,WrappedArray())),None)

Keyパーツは空です。

質問

アドホックエラーを表示するにはどうすればよいですか?

私も試しました:

BadRequest( views.html.test( formWithErrors ) ).flashing( "error" -> "Invalid user name or password." ) },

しかし、何らかの理由でフラッシュ経由でも機能しません:(。これ@flash.get("error").getOrElse("no 'error'")により、毎回「エラーなし」になります。

4

1 に答える 1

1

実際には、フォームをerrors添付することができるため、リクエストからのバインドが制約の検証に失敗すると、指定されたフォームに基づいて新しいフォームが作成されますが、が入力されerrorsます。

このようなエラーリストは FormError、フォームフィールドを参照し、toStringをオーバーライドして埋め込みメッセージを表示するもので構成されます。

このように、すべてのメッセージを一度に表示したい場合はformWithErrors.errors.mkString("<br>")、たとえば(テンプレートまたはフラッシュで)簡単に行うことができます。

多くの方法があり、いくつかの一般的な方法はここhttp://www.playframework.org/documentation/2.0.2/ScalaFormHelpersで説明されています。独自のフィールドコンストラクターを定義することもできます。

結論として、ヘルパーamap(たとえば@inputTextco)を使用する必要があるというアドバイスがあります。これは、ヘルパー、ヒント、およびエラーが利用可能な場合にそれらを表示するロジックが既に含まれているためです。

編集

(implicit flash: Flash)フラッシュの問題についてのヒントを見逃しました...おそらくテンプレートパラメータリストに追加するのを忘れているでしょう。(アクション定義でも、リクエストに暗黙のフラグを立てることを忘れないでください)

于 2012-07-08T18:56:11.467 に答える