Life is TraversableOnce

programming / Java / Scala / Rust

Skinny Tutorial #3 机上のクーロン(1)

ほぼ静的なページ

移動中に時間が取れそうなので、机上でのシミュレーションになりますが、第3章へトライしていきましょう。 実際のアプリケーションでの動作確認も、もちろん追記していきますよ!

あたらしいプロジェクトを用意して、まずは静的なページのコントローラからです。 チュートリアルではgenerateスクリプトを活用していますが、せっかくなのでいちから書いてみることにします。 わたしはキーボードをタイプするのが好きなのです。

/* ---- StaticPagesController.scala */
class StaticPagesController extends ApplicationController {
  def home = render("staticpages/home")
  def help = render("staticpages/help")
}

/* ---- Controllers.scala */
object Controllers {
  def mount(ctx: SkinnyContext): Unit = {
    root.mount(ctx)
    staticPages.mount(ctx) // 追加
    ...
  }

  ...

  object staticPages extends StaticPagesController with Routes {
    val homeUrl = get("/staticpages/home")(home).as('home)
    val helpUrl = get("/staticpages/help")(help).as('help)
  }
}

一つめのStaticPagesControllerが、静的なページたちに対応するコントローラ本体で、実行するアクションを定義しているクラスです。renderメソッドは、指定した位置にあるViewテンプレートを描画する指示を行っています。

二つめのControllersは、サンプルアプリケーションにも最初から用意されているオブジェクトで、各コントローラを、リクエストの種類(HTTPメソッドの種類)と要求されたURLから構成されるルーティングに対応させる役割を持っています。 Scalatraのサーブレット/フィルタをラップしたもので、最下部のstaticPagesオブジェクトがルートに対してアクションの解決を行っています。

val homeUrl = get("/staticpages/home")(home).as('home)

getメソッドは、リクエストがHTTPのGETメソッドで送信された場合のルーティング定義であることを表します。第1引数の文字列がマッチさせるためのURLパターン、第2引数でスーパークラスのアクションメソッドを引き渡しています。最後に、Skinny独自の処理として、ルーティング全体をシンボルで識別できるようにしています。

このコードでは、コントローラをインスタンス化するさいにコントローラクラスを継承したシングルトンのかたちをとっていますが、Skinny Frameworkの公式ドキュメントには、コントローラを直接newインスタンス化し、Routesトレイトをミックスインしたvalとして用意する例も紹介されています。

これでviewテンプレートさえ用意すれば、静的なページを表示できるようになりました。

思いのほか時間をかけてしまったので、シミュレーションの続きと動作確認は次回としましょう。 テストの書き方も、早く実践してみたいですね。

(続く)