PlayFrameworkのチュートリアル(挫折版)

前回の記事の続きです。

HelloWorldを表示したので、次はチュートリアルに沿ってサンプルアプリケーションを組んでみたいところですが、 公式のPlay 2.4のドキュメントには英語のチュートリアルしか無いようなので、 Play 2.2の時の日本語チュートリアルを参考にTODO管理アプリケーションを組んでいきたいと思います。
…って思ってたけど、Taskモデルの準備のところでJavaの書き方がわからず挫折しました!
誰かの参考になるかもなので途中まで書いたものは残しておきます。。。

概要

conf/rotesファイルを開きますが、書き方がチュートリアルとちょっと変わっています。

GET     /                           controllers.HomeController.index

が、意味は一緒です。app/contorollers/HomeController.javaを開いてみます。

package controllers;

import play.mvc.*;

public class HomeController extends Controller {

    public Result index() {
        return ok(views.html.index.render());
    }

}

どうやらindex()メソッドが動いて、HTMLコンテンツを含む200 OKレスポンスを返しているようです。
HTMLコンテンツとのマッピングviews.html.(HTMLのファイル名).render()という書き方になるようです。
次はapp/views/index.scala.htmlを開いてみます。

@()

@main("Welcome to Play") {
  <h1>Welcome to Play!</h1>
}

ここはチュートリアルと違ってべた書きしてあります。

開発フロー

チュートリアルのようにcontrollersからviewsに値を渡したい場合、どのように書けばよいでしょうか。
まずapp/views/index.scala.htmlを開いて次のように書き換えます。

@(message: String)

@main("Welcome to Play") {
  <h1>@message</h1>
}

次にapp/contorollers/HomeController.javaを開いて次のように書き換えます。

package controllers;

import play.mvc.*;

public class HomeController extends Controller {

    public Result index() {
        return ok(views.html.index.render("Hello World"));
    }

}

書き換えたらブラウザからlocalhost:9000を開いてみます。
Hello Worldと表示されるはずです。
viewsの一行目に変数を宣言すれば、controllersから引数を渡せることがわかりました。

アプリケーションの準備

conf/rotesファイルを編集します。以下の3行を追加します。

# Tasks
GET     /tasks                      controllers.HomeController.tasks
POST    /tasks                      controllers.HomeController.newTask
POST    /tasks/:id/delete           controllers.HomeController.deleteTask(id: Long)

ブラウザをリロードするとチュートリアルのようにコンパイルエラーが発生する事が確認できます。 次にapp/contorollers/HomeController.javaに以下の行を追加します。

public Result tasks() {
    return TODO;
}

public Result newTask() {
    return TODO;
}

public Result deleteTask(Long id) {
    return TODO;
}

ブラウザからlocalhost:9090/tasksを開くとTODOが表示されます。
チュートリアルと同じようにindexアクションが呼び出された時に、tasksアクションにリダイレクトするようにします。

public Result index() {
    return redirect(routes.HomeController.tasks());
}

Taskモデルの準備(ここで挫折)

Javaで書く場合はModelクラスを継承したTaskクラスをmodels/Task.javaとして実装すれば良さそうでしたが、なんのパッケージのModelクラスをimportすればよいかわからず手詰まりになりました。

感想

ググると日本語の情報はわりとすぐ出てくるのですが、Playのバージョンが2.2の時と2.4の時と2.6の時で若干やり方が違うようで、いい感じに読み替えたり英語のドキュメントにあたるスキルが必要そうだと感じました。 作ってみたいWebアプリケーションはあるので、日本語のチュートリアルが充実している(と思われる)Ruby on Railsに挑戦してみたいと思います。