Hatena::ブログ(Diary)

すにぺっと

2011-04-18

play-scalaを改めて学ぶ-4 Scalaで書くPlayのコントローラー

| 12:00 | play-scalaを改めて学ぶ-4 Scalaで書くPlayのコントローラーを含むブックマーク

コントローラー部分を見てみる。

Google翻訳とともに苦手な英語を頑張る。

翻訳間違ってたらスマヌ。

http://scala.playframework.org/documentation/scala-0.9/controllers


playフレームワークにおいて重要なファクターであるコントローラー。

Scalaを使用するとより機能的に記述をすることができる。



Scala controllers are Objects

コントローラーはcontrollersパッケージにおいて、

Scalaのシングルトンオブジェクトを使用。

そして、play.mvc.Controllerを継承すること。

さらに、Scalaの場合は同一ファイルに複数のコントローラーを

書くことができると。

package controllers {
    
    import play._
    import play.mvc._
    
    object Users extends Controller {
        
        def show(id:Long) = Template("user" -> User.findById(id))
        
        def edit(id:Long, email:String) = {
            User.changeEmail(id, email)
            Action(show(id))
        }
        
    }
    
}

実際Scalaの場合のファイルとクラスの対応ってどうするのがいいんだろ?

Javaの場合だとクラスとファイルが1:1が基本だからいいけど、

このへんの標準とか作法がいまいちわからん。


Action methods return values

playのコントローラーは通常、 render(…) とか forbidden()のような

メソッドを使用してレスポンスを返している。

また、Scalaで書かれたアクションメソッドでは、関数のように値を返す必要がある。

この値は、HTTPレスポンスを生成するために

フレームワークによって使用される。


ここでいくつかの例を紹介。

Ok

Ok valueを返す。これはHTTPステータスで、空の200 OKを返す。

def index = Ok

Template

アクションメソッドがTemplateを返す場合、

コンテンツが生成され、Status200でレスポンスが返される。

def index = Template

デフォルトではテンプレート名はアクションメソッド名から

解決される。

つまり、

controllers.Application.index メソッドがTemplateを返すと、

app/views/Application/index.htmlが返される。


こうすれば別のファイルを返すことも可能。

def index = Template("Commons/home.html")

この場合、

app/views/Commons/home.html

が返される。


また、テンプレート内で評価されるような値を渡すことも可能。

(Symbol,Any)で構成されるタプルを渡せばOK.

Symbolはテンプレート内で使用される変数名。

Anyはその値。

def index = Template('now -> new Date(), 'numbers -> List(1,2,3))
It would be to complex to achieve the same thing in 
Scala without limiting the expressivness of your Scala code 
(that can contains pattern matching, lambda, etc…). 
Moreover because we use Tuple definitions here, the result is not so verbose.

原文ママ。なにいってんのかよくわからん。


Html

Htmlは、HTMLコンテンツをStatusコード200で返す。

contet-typeは自動でtext/htmlにセットされる。

def index = Html("<h1>Hello world!</h1>")

Xml

XMLは、XMLコンテンツをStatusコード200で返す。

contet-typeは自動でtext/xmlにセットされる。

def index = Xml(<message>Hello world!</message>)

Text

Textは、テキストコンテンツをStatusコード200で返す。

contet-typeは自動でtext/plainにセットされる。

def index = Text("Hello world!")

Json

Jsonは、テキストコンテンツをStatusコード200で返す。

contet-typeは自動でtext/jsonにセットされる。

def index = Json("{message: 'Hello world'}")

さらに、Scalaの任意のオブジェクトを渡せば、

Playフレームワークシリアライズしてくれる様子。

def index = Json(users)

しかし現在、複雑な構造をしているScalaオブジェクトの場合は

期待通りに動かないらしい。

うまく動かすには、LiftのJSONライブラリを使用して、こんな感じにしたりする。

 Json(JsonAST.render(users))

play-scala1.0ではLiftのJSONライブラリがマージされるとかなんとか。


次はCreatedから。


プログラミングScala
プログラミングScala
posted with amazlet at 11.04.18
Dean Wampler Alex Payne
オライリージャパン
売り上げランキング: 87199

トラックバック - http://d.hatena.ne.jp/sy-2010/20110418/1303095629
Connection: close