表題の通りです。Scalatra で Slick を使っててはまりました。
はまりポイント
get("/") {
db withSession {
Pokemons.insert(303, "Mawile")
}
}
^ みたいな、Slick を使って insert するだけの簡単なお仕事をするアクションをブラウザから叩くと、データは挿入されるのにページのロードが全然終わらない。。公式 にサンプルとして載ってるレベルなのに。。つらい。
insert の返り値ってなんなの??
当然ここを疑います。
こちらの記事 を参考にして xerial-lens で返り値の型を出力してみると、Int
の 1 でした。
どういうこと??
公式の Actions の Default behavior によると、Int
は Any
に該当するはずで、その Any
はどうなるかというと、、
For any other value, if the content type is not set, it is set to text/plain. The value is converted to a string and written to the response’s writer.
とあります。なので、String
に変換されると思っていたのですが、それが間違いでした。
Scalatra の ソースコード をたどってみると、現時点(2.3 系)の scalatra/core/src/main/scala/org/scalatra/ScalatraBase.scala
の renderPipeline
に以下のようなコードが。。
case status: Int => response.status = ResponseStatus(status)
HTTP のレスポンスコードに変換されてるや〜ん。すっきり〜。
でも仕様としてどうなんでしょこれ??