連載
» 2013年04月11日 18時00分 公開

Play 2.1にアップグレードしてコントローラを使いこなすScala+Play 2.0でWebアプリ開発入門(5)(2/3 ページ)

[中村修太,クラスメソッド]

パラメータのバインド

 さて、Play 2.1へのマイグレーションも無事終了したので、今回もPlayの機能を紹介していきましょう。前回は、コントローラやActionの基本的な使い方を紹介しました。この章では、コントローラのまだ紹介していない機能について説明します。

コントローラの引数に定数やデフォルト値を渡す

 前回、conf/routesファイルで定義するコントローラの引数は、下記のように指定していました。

GET   /sample3            controllers.SampleController.sample3(id:Long)

 これ以外にも、「routes」で定義できる引数は、定数やデフォルト値を指定できます。いつものように、gyroアプリケーションで動作を確認してみましょう。routesに下記のような記述を追加します。

#引数に定数を指定
GET     /sample5          controllers.SampleController.sample5(fixedValue="fixed")
#引数にデフォルト値を指定
GET     /sample6          controllers.SampleController.sample6(defaultValue:Int ?= 1)

 「sample5」は引数に定数を指定しており、「sample6」は引数にデフォルト値を指定しています。続いて、SampleControllerに下記メソッドを追加しましょう。

/** 引数に定数を取る */
def sample5(fixedValue: String) = Action {
    println("fixedValue:" + fixedValue)
    Ok(views.html.index("fixedValue:" + fixedValue))
}
/** 引数にデフォルト値を取る */
def sample6(defaultValue: Int) = Action {
    println("defaultValue:" + defaultValue)
    Ok(views.html.index("defaultValue:" + defaultValue))
}

 SampleControllerにメソッドを追加したら、Playコンソールでgyroアプリケーションを再起動しましょう。

#Playコンソール
[gyro] $ run

 「http://localhost:9000/sample5」とアクセスしてみてください。パラメータにはfixedが設定されています。「http://localhost:9000/sample5?fixedValue=xxx」とアクセスしたとしても、定数なので「fixedValue」の値は変わりません。

 「http://localhost:9000/sample6」とアクセスした場合には、「config/routes」で指定したデフォルト値である「1」が設定されます。「http://localhost:9000/sample6?defaultValue=100」とアクセスした場合、「defaultValue」には「100」が設定されます。

コントローラの引数にOption型を使用する

 コントローラのパラメータには、Option型を指定することもできます。Option型を使用した場合、対象のパラメータがあればSome型となり、パラメータがなければNone型となります。「routes」ファイルに、Option型の引数を取るコントローラ定義を追加しましょう。

#引数でOption型を使用する
GET     /sample7          controllers.SampleController.sample7(optValue:Option[String])

 routesファイルの定義に従い、SampleControllerに下記メソッドを追加します。

optValueの状態に応じて、パターンマッチで返す値を変更しています。

def sample7(optValue: Option[String]) = Action {
    println("optValue:" + optValue)
    val res = optValue match {
        case Some(opt) => opt
        case None => "nothing"
    }
    Ok(views.html.index("optValue:" + res))
}

 コントローラの記述ができたら、アプリケーションを再起動して「/sample7」にアクセスしてみてください。クエリ文字列に「optValue」があればSome型、なければNone型が引数に代入されます。

リバースルーティング

 得てしてアプリケーション内で定義されたURLは変更されるものです。コントローラ内から他のコントローラへリダイレクトしたいケースを考えてみましょう。

 直接URLを文字列で記述した場合にそのURLを変更した場合、コントローラ内の記述も変更しなくてはいけません。そのようなケースで役に立つのが、コントローラからURLを逆引きする「リバースルーティング」です。

 コンパイル時、「conf/routes」ファイルで使用している全てのコントローラのリバースコントローラが、「controllers.routes」パッケージ下に生成されます。リバースコントローラは元になったコントローラと同じ引数を持つ関数を持っており、「play.api.mvc.Result」ではなく「play.api.mvc.Call」を返すメソッドを持っています。

 では、SampleControllerのリバースコントローラを使ってみましょう。以前に定義したsample2メソッドを下記のように修正します。

    def sample2 = Action {
        Redirect(routes.SampleController.sample1)   
    }

 sample2メソッドが実行されると、routes.SampleControllerリバースコントローラを使用してsample1メソッドを呼び出しています。コントローラを修正した後、「http://localhost:9000/sample2」にアクセスしてみてください。リダイレクトされてsample1が表示されます。

補足 コントローラを定義せずリダイレクト

 先ほどは自分で定義したコントローラからリダイレクトさせましたが、自分でコントローラを作らずに「routes」ファイルに記述するだけでリダイレクトする方法があります。

 例えば、「sample2」を「sample1」へリダイレクトしたい場合は、下記のように記述するだけでリダイレクト可能です。

GET     /sample2          controllers.Default.redirect(to = "/sample1")

 controllers.Defaultクラスは、Playが標準で用意しているコントローラです。引数「to」には、リダイレクトさせたいパスを設定します。もちろん、外部サイトへリダイレクトさせたい場合も次のように記述すればOKです。

GET     /sample2          controllers.Default.redirect(to = "http://www.itmedia.co.jp/keywords/scalaplay.html")

 単純にリダイレクトさせたいだけなら、controllers.Default.redirectを使うのが楽で良いでしょう。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。