【再】Play 2.x の QueryStringBindable, PathBindable について

先日 Play 2.x の QueryStringBindable, PathBindable について - tototoshiの日記 で joda-time 用に QueryStringBindable[T] を定義して遊びましたが、それをライブラリ化しました。ご自由にお使い下さい。

tototoshi/play-joda-routes-binder · GitHub


設定を加えるだけで、

  val main = play.Project(appName, appVersion, appDependencies).settings(
    libraryDependencies ++= Seq(
      "com.github.tototoshi" %% "play-joda-routes-binder" % "0.1.0"
    ),
    routesImport += "com.github.tototoshi.play2.routes.JodaRoutes._"
  )


conf/routes で LocalDate, DateTime が使えるようになります。やったね!

GET     /list                 controllers.Application.index(date: org.joda.time.LocalDate)
GET     /entry/$date<[0-9]+>  controllers.Application.entry(date: org.joda.time.LocalDate)

フォーマットを変える

日付のデフォルトのフォーマットは yyyyMMdd にしてあります。yyyyMMdd やだー、yyMMdd がいいって人は次のようにします。

object MyRoutes {
  val myJodaRoutes = new JodaRoutes {
    override val format: String = "yyMMdd"
  }
}

これを Build.scala に書きます。

routesImport += "MyRoutes.myJodaRoutes._"

LocalDate だけ使いたい、DateTime だけ使いたい、2つのフォーマットを分けたい、って人は JodaRoutes の変わりに JodaLocalDateRoutes, JodaDateTimeRoutes を使ってください。

苦情

これ本当は Play 本体に pull request 送りたかったんですが、今の routesImport の仕組みがダメダメすぎてダメでした。


Play 本体にデフォで QueryStringBindable[LocalDate] があったとします。
さらにユーザーが新たに別フォーマットの QueryStringBindable[LocalDate] を定義します。
すると、、、、2つの QueryStringBindable[LocalDate] がぶつかって解決できません。なんてこった。


というわけでそこらへんの implict スコープをユーザーが調整できる仕組みがないとなかなかつらいです。