質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

Q&A

解決済

2回答

3355閲覧

play framework 2.5(Scala版)でのValidation の扱いについて

退会済みユーザー

退会済みユーザー

総合スコア0

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

0グッド

0クリップ

投稿2017/02/08 00:52

Play Framework 2.5.xのScala版を利用して、プログラムを作っています。

Validation の処理で、わからないことがあり、質問させて頂きます。

入力チェックで、下記のような入力チェックを実装したいと考えています。

【チェック条件】
1.必須チェック
2.1の処理が通ったら、チェックAを実行
3.2の処理が通ったら、チェックBを実行

verifyingを利用して実装しようとしておりました。

想定では、

scala

1nonEmptyText.verifying("チェックA").verifying("チェックB")

と、記載すれば、上記の条件が満たされるのではないかと考えておりました。
しかし、実際には、verifyingに記載した内容は、全て実行されてしまいました。

そこで、現状下記のような記述をしております。

scala

1nonEmptyText 2 .verifying(!"必須チェック" || "チェックA") 3 .verifying(!"必須チェック" || !"チェックA" || "チェックB") 4 5) 6 val userForm = Form( 7 mapping( 8 "userId" -> nonEmptyText 9 .verifying("No User Auth", bid => userId.isEmpty || db.auth(userId).isDefined) 10 )(UserForm.apply)(UserForm.unapply) 11 )

想定通りの動作はするのですが、非常に冗長的になってしまっています。
今まで、Java版を利用してプログラムを利用していたのですが、Java版の場合、validation メソッドの中に、
記述すれば、細かく記載できたのですが、Scala版の勝手がいまいちわかりません。

上記、条件が満たされるような Validationのシンプルな書き方があれば、
ご教授いただけないでしょうか?

お手数をおかけしますが、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ありがとうございました。

ご指導頂き巻いた方法で実装したら、解決いたしました。

今後共、よろしくお願い致します。

投稿2017/02/12 23:17

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Constraint を記述して def verifying(constraints: Constraint[T]*): Mapping[T] の方を使うと良いのではないでしょうか。
verifying で指定した Constraint は途中でエラーが見つかっても全て評価されるため、最初のエラーで中断したい場合には1つの Constraint にチェックを詰める必要があります。
nonEmptyText の実装は text verifying Constraints.nonEmpty となっているので、Constraints.nonEmpty を利用すると次のようになると思います。

scala

1import play.api.data.validation.{Constraint, Constraints, Invalid, Valid} 2 3val constraint = Constraint[String] { string => 4 Constraints.nonEmpty(string) match { 5 case invalid: Invalid => invalid 6 case Valid => 7 if (/* チェック1 */) { 8 Invalid("check1 error") 9 } else if (/* チェック2 */) { 10 Invalid("check2 error") 11 } else { 12 Valid 13 } 14 } 15} 16 17text.verifying(constraint)

投稿2017/02/08 01:27

編集2017/02/10 07:51
tkawachi

総合スコア117

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/02/08 05:08

ご回答ありがとうございます。 少し、記述方法を変えて、下記のように記載しました。 ```scala val userConstraint: Constraint[String] = Constraint("user.check")({ bid => if (!db.auth(bid).isDefined) { // 処理1 Invalid("No User Auth") } else { Valid } }) nonEmptyText.verifying(userConstraint) ``` 上記を実行すると、nonEmptyTextとverifyingの内部の処理が 両方実行されます。 結局、上記の「処理1」のところで、値がnullかどうかの確認をする必要があるということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問