9

オプションで 2 つのパラメーターを受け入れるアクションがあるとします。

def foo(name: String, age: Integer) = Action { 
  // name & age can both be null if not passed
}

route次の呼び出し構文のいずれかで動作するようにファイルをセットアップするにはどうすればよいですか。

/foo
/foo?name=john
/foo?age=18
/foo?name=john&age=18
/foo?authCode=bar&name=john&age=18    // The controller may have other implicit parameters

これの正しい構文は何ですか?

4

1 に答える 1

18

このようなものが動作するはずです:

GET  /foo         controllers.MyController.foo(name: String ?= "", age: Int ?= 0)

パラメータは省略できるため、デフォルト値を指定する必要があります (コントローラ関数でそれらの値を処理します)。

暗黙的なリクエストを渡して getQueryString パラメータにアクセスすると、コントローラの他のオプション パラメータにアクセスできるはずです (Play 2.1.0 で追加されたと思います)。

def foo(name: String, age: Integer) = Action { implicit request =>
   val authCode: Option[String] = request.getQueryString("authCode")
   ...
}

これを行うためのより良い方法は、コントローラーのパラメーターからオプションの名前と年齢を取り出し、queryString からすべてを抽出することです。

def foo = Action { implicit request =>
    val nameOpt: Option[String] = request.getQueryString("name")
    val ageOpt: Option[String] = request.getQueryString("age")
    ...
}

更新: 2.1.1 の現在のドキュメントはこれについて少しずれています (issue #776 で修正されたため) が、これは別の (そして最良の、IMHO) オプションです。

GET  /foo    controllers.MyController.foo(name: Option[String], age: Option[Int])

と...

def foo(name: Option[String], age: Option[Int]) = Action { implicit request =>
    Ok(s"Name is: $name, age is $age")
}
于 2013-04-30T14:39:44.833 に答える