LoginSignup
3
2

More than 5 years have passed since last update.

Playでクエリストリングを配列(List)や任意の型で受け取る

Last updated at Posted at 2016-12-27

配列(List)で受け取る

ソースコード

ソースコードのポイント抜粋

routesファイルの抜粋

GET     /                           controllers.TestController.index(n: List[Int])

Controllerのメソッド

  def index(numbers: List[Int]) = Action {
    Ok(views.html.index(numbers))
  }

ポイント

  • routesで指定するの仮引数(?)の(n :List[Int])とクエリストリングの名前が一致していれば良い。
  • Controllerの仮引数はわかりやすく変更することができる
  • 上記の例では「n」がクエリストリングで、対応するControllerの仮引数が「numbers」
  • クエリストリングを指定するときは「?n=1&n=3&n=5」のようにnを複数個指定する。
  • RequestからもSeq型で取得することができるが、その場合Seq[String]になっているので、リストの要素を任意の型にできるのでこちらのほうが楽(だと思います)。

ちなみに1つパラメータの場合

Controllerを次のようにすればクエリストリングを受け取ることができます。

必須パラメータの場合

  def index(number: Int) = Action {
    ...
  }

オプション(指定しなくてもよい)のパラメータの場合

  def index(number: Option[Int]) = Action {
    ...
  }
  • RequestからもSeqで(ry

任意型(自分で作ったcase classなど)で受け取る

QueryStringBindableを拡張すれば、任意の型へクエリストリングを変換することが可能です。

参考
* http://tototoshi.hatenablog.com/entry/20130216/1360985707
* http://qiita.com/arc279/items/dcf0ae364a692b0a65eb

イメージとしては「クエリストリング⇔受け取りたい型」の相互変換のコードを記述する感じです。上記の記事で出てくる「PathBindable」はrouteのPath記述部で受け取るパラメータを任意の型へ変換するためのものだと思います(たぶん)。この辺りはまだ公開できるソースを書いていないので、書いたら記事を更新したいと思います。

2016.12.29追記

記事書きました
- Playでクエリストリングをcase class(自分型、任意のオブジェクト)で受け取る

その他

記事の記述の際の調査の際に重複した記事を見つけました。
playframeworkのroutingでListを受ける

投稿をやめようかと考えましたが、次の理由により投稿しました。

  • あらためて投稿することにより多くの方と知識を共有できるかもしれない
  • 自分型へのつなぎの部分も載せたかった
  • 自分の備忘をPublicな場所に置いておきたかった

結論・感想のようなもの

型は素晴らしい。静的型付けの恩恵が受けられる形でなるべくコードを書きたいですね。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2