menu
書いてる野郎
orebike@gmail.com
Play2-Scala 2.3
Action の内部実装は非常に巧妙で複雑なので理解するのは大変。なので Play はこういうもんなんだとおぼえてしまって割りきったほうがよい。
def myText = Action { Ok("Hello World") }
def myXml = Action { Ok(<hoge>ほげ</hoge>) }
ScalaにはXMLリテラルがある
def myXmlAsHtml = Action { Ok(<h1>ほげ</h1>).as(ContentTypes.HTML) }
このレスポンスのコレクションは play.api.http.ContentTypes に定義されているのでここを起点に書けば間違いはないだろう。サンプルとかだと端折っていきなり書いていることがおおいのでね。
def myTextAsMyContentType = Action { Ok("hogehoge").as("hoge/piyo") }
def myTextAppendHeader = Action { Ok("hogehoge").withHeaders((HeaderNames.CACHE_CONTROL, "max-age=3600")) }
括弧はタプルリテラル
def myCookie = Action { Ok("hogehoge").withCookies( Cookie("hoge", "ほげ"), Cookie("piyo", "ぴよ") ) }
def myDelCookie = Action { Ok("hogehoge").discardingCookies(DiscardingCookie("hoge")) }
def myRedirect = Action { Results.MovedPermanently("http://www.yahoo.co.jp") }
def myRedirectToMyText = Action { Redirect(routes.hoge.mytext()) }
def myBadRequest = Action { Results.BadRequest("Bad!") }
def myForbidden = Action { Results.Forbidden("Forbidden") }
def myNotFound = Action { Results.NotFound("Not Found") }
def myInternalServerError = Action { Results.InternalServerError("InternalServerError") }
def myStatus = Action { Results.Status(999) }
def myViewSimple = Action { Ok(views.html.MyView.simple()) }
def myViewParams = Action { Ok(views.html.MyView.params(title = "aaaaaaaaaaaaaa", body = "bbbbbbbbbb")) }
こういう場合はOKだけどこの場合は500とかそういう Action 内での分岐するやり方。 Java とは違うので注意が必要な部分である。
Scala の流儀として return を書かないというものがある。 メソッドの最後の評価値を return とするのが定石。 つまり return を書かない。つまりメソッドを途中で中断しないということである。
やればわかるが Action の途中で return を書くとその戻りの型記述を強制されるのだが、これがどう指定してもシンプルにならない。
なので途中結果を控えておいて、メソッドの最後に match で分岐するのが Scala のやり方である。