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 に挑戦してみたいと思います。

Built with Hugo
テーマ StackJimmy によって設計されています。