

playframework(2.5.6)で以下のようなフォームの入力を作っています。

[code]

    case class User(age: Option[Int])
    
    val form = Form(
      mapping(
        "age" -> optional(number)
      )(User.apply)(User.unapply)
    )
    println(form.bindFromRequest().value)
    
[/code]

フォーム編集時に空文字が送られてきたらDBの値をNULLにしたいんですが、Option[Int]の場合、空が送られてきたかどうか判断できません。  
例えば、

  * ?age=20 : Some(20)
  * ?age= : None
  * なし : None

となってしまうので、DB更新時に送られてきてないのか、それとも空にしたいのか分かりません、、、。  
どうするのが良いでしょうか。詳しい方教えてください。よろしくお願いします。


CC BY-SA 3.0
2016-09-13T01:14:52.867
28847
2016-11-29T12:26:30.507
17284
question
scala playframework
Playで編集時にDBの値を空にするには


PlayのForm周りは詳しくありませんが回答します。

`form.bindFromRequest`は`implicit request`のbodyからデータをbindします。

<https://github.com/playframework/playframework/blob/2.5.6/framework/src/play/src/main/scala/play/api/data/Form.scala#L76-L88>

つまり、`request.body`に`age`をキーとするデータが含まれているかどうかで判別可能かと思います。

BodyParserが未指定の場合、`request.body`の型は`AnyContent`になっていて判別が面倒です。  
下記のように`BodyParsers.parse.urlFormEncoded`を指定してMapとして取得できるようにします。

[code]

    def addUser = Action.async(BodyParsers.parse.urlFormEncoded) { implicit request =>
      form.bindFromRequest().fold(
        errorForm => {
          // error
        },
        user => {
          if (request.body.contains("age")) {
            // form から"age"が送信されてきた
    
          } else {
    
          }
        }
      )
    }
    
    case class User(age: Option[Int])
    
    val form = Form(
      mapping(
        "age" -> optional(number)
      )(User.apply)(User.unapply)
    )
    
[/code]


CC BY-SA 3.0
2016-09-13T10:05:47.697
28858
2016-09-13T10:05:47.697
3068
28847
answer