さて、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型を使用した場合、対象のパラメータがあれば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.