【再】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 スコープをユーザーが調整できる仕組みがないとなかなかつらいです。