Documentation

You are viewing the documentation for the 2.1.5 release in the 2.1.x series of releases. The latest stable release series is 2.4.x.

§Javascript ルーティング

Play のルータには、クライアントサイドで実行される JavaScript から サーバアプリケーションへのルーティングを行うための Javascript コードを生成する機能があります。この機能を利用すると、アプリケーションの URL 構成やパラメータ名を変更したとしても、 JavaScript コードを変更する必要がなくなります。

§Javascript ルータの生成

Play の Javascript ルータを利用するにあたってまず必要なことは、それを生成することです。 Javascript ルータは、設定時に指定されたルートだけを提供するようになっています。これにより、生成される Javascript コードのサイズが最小限になります。同時に、アプリケーションの構造をクライアントサイドが知る必要のないところまで晒してしまうということもなくなります。

Javascript ルータの生成方法は二通りあります。一つは Scala テンプレートの関数を使ってルータを HTML ページに埋め込むというものです。もう一つは、アクション内で Javascript リソースを生成して、様々なページからダウンロード、キャッシュ、そして共有できるようにするというものです。

§埋め込みルータ

埋め込みルータは Scala テンプレート内で @javascriptRouter 関数を呼び出すことで生成できます。記述箇所としてよくあるのは、親テンプレートでしょう。

@helper.javascriptRouter("jsRoutes")(
  routes.javascript.Users.list,
  routes.javascript.Users.get
)

第一引数は生成されるルータのグローバル変数名です。第二引数はこのルータに含められるルートのリストです。この関数を利用するためには、テンプレートのスコープ内に implicit な RequestHeader が必要です。例えば、 (implicit req: RequestHeader) をテンプレートの引数宣言の最後に追加するとよいでしょう。

§ルータリソース

ルータリソースの作り方は、ルータジェネレータを呼び出すアクションを作る、というものです。ルータジェネレータを呼び出す際の文法は、 Scala テンプレート内にルータを埋め込む際のそれと似ています。

def javascriptRoutes = Action { implicit request =>
  import routes.javascript._
  Ok(
    Routes.javascriptRouter("jsRoutes")(
      Users.list,
      Users.get
    )
  ).as("text/javascript")
}

このようなアクションを実装して routes ファイルへ追加したら、 Scala テンプレート内で以下のような記述をすることでルータを読み込むことができます。

<script type="text/javascript" src="@routes.Application.javascriptRoutes"></script>

§ルータの利用

ルータはデフォルトでは jQuery を利用して HTTP リクエストを生成します。おかげで、リクエストを生成するコードは次のような簡単なものになっています。
jsRoutes.controllers.Users.get(someId).ajax({success: /*…/, error: /…*/});

また、ルータは各ルートの詳細情報として url` やmethodabsoluteURL`` などといったプロパティを提供します。

§AJAX メソッドをカスタマイズする

jQuery をお使いでないか、または jQuery の ajax メソッドをラップしたいといった場合には、AJAX リクエストを行うための任意の関数をルータに提供することができます。この関数はルータの ajax メソッドの引数と同じ形式のオブジェクトを引数にとります。また、このオブジェクトの typeurl プロパティはそれぞれルータがリクエストに応じて設定してくれるものとします。

この関数を定義するためには、アクション内でメソッドに ajaxMethod という名前の引数を渡しましょう。

Routes.javascriptRouter("jsRoutes", Some("myAjaxFunction") ...