Yesod入門 (3) Handler の作成から Shakespearean Templates による View の作成まで

こんにちは、鈴木です。

 

Yesod 入門の第 3 回です。

今回は Handler の作成方法から始めて、各種テンプレート言語を使って簡単なページを作成するところまで行いたいと思います。

 

yesod add-handler による Handler の生成

yesod コマンドの引数に add-handler を指定して実行すると Handler を生成することができます。

Ruby on Rails における scaffold のようなものです。

実行すると作成する Handler の名前を求められますので、「Hello」と入力して先に進みましょう。

ちなみに Yesod では Handler の名前は「R」で終わる決まりがあります(「Resource」の「R」です)。

続けて URL のパスを求められますので、「/hello」と入力します。

最後に許可する HTTP のメソッドの指定です。ここでは「GET」を指定します。

ここまで入力すると、実際にコード生成が行われます。

  • 作成: Handler/Hello.hs
  • 変更: config/routes
  • 変更: Application.hs
  • 変更: hello-yesod.cabal

Handler/Hello.hs は作成した Handler のコードが含まれるファイルです。

config/routes にはルーティング情報が追加されます。

Application.hs と hello-yesod.cabal には Handler/Hello.hs で定義されるモジュールをインポートするコードが追加されます。

 

Handler

Handler/Hello.hs を開いてみると、以下のようになっています。

コード生成直後の実装は「getHelloR = error "Not yet implemented: getHelloR"」となっています。

この状態でサーバを起動(yesod devel)し、ブラウザで確認すると「Not yet implemented: getHelloR」と書かれた画面が表示されます。

yesod-hello1

Handler/Hello.hs を以下のように変更します(最後の行を変更します)。

最後の 1 行を「defaultLayout $(widgetFile "hello")」に変更しました。

これで templates/hello.hamlet を使用して画面が生成されるようになります(templates/hello.hamlet は後ほど作成します)。

 

View

Yesod では View に関するテンプレートファイルを templates ディレクトリ内に配置します。

 

Shakespearean Templates

View には「Shakespearean Templates」または「Shakespearean ファミリーのテンプレート言語」と呼ばれるテンプレート言語を使用します。

Shakespearean Templates は全部で 4 種類あります。

  • Hamlet
    HTML 用のテンプレート言語です。
    インデントによってタグの入れ子を表現します。
  • Cassius
    CSS 用のテンプレート言語です。
    インデントによって入れ子を表現します。
  • Lucius
    こちらも CSS 用のテンプレート言語です。
    Cassius とは異なり、CSS のスーパーセットとなっています。
  • Julius
    Javascript 用のテンプレート言語です。
    ほとんど Javascript と同じですが、変数補間をサポートしています。

上記テンプレート言語はどれも、変数補間(Haskell 側で定義した変数の値をテンプレートに埋め込む機能)をサポートしています。

また、CSS 用のテンプレート言語は Cassius と Lucius の 2 つあります。どちらを使用しても良いですが、Lucius は CSS のスーパーセットなので、既存の CSS を取り込む場合は Lucius を選択すると良いでしょう。

 

Hamlet (HTML)

それでは HTML のテンプレートファイルを作成します。

templates/hello.hamlet というファイルを作成し、以下の内容を記述します。

HTML 用のテンプレート言語「Hamlet」では、タグの入れ子構造をインデントによって表現します。

そのため、閉じタグ(「<li>」に対する「</li>」)は必要ありません。

この状態でブラウザで確認すると、このように表示されるはずです。

yesod-hello2

 

Cassius (CSS)

次に CSS でデザインを変更してみましょう。

CSS 用のテンプレート言語は「Cassius」と「Lucius」の 2 つありますが、ここでは Cassius を使用します。

templates/hello.cassius を作成し、以下の内容を入力します。

Cassius も Hamlet と同様に、インデントで入れ子構造を表現します。

国別に文字色を変えてみました。

ブラウザで確認すると、次のように表示されます。

yesod-hello3

 

Lucius

ちなみにもう一つの CSS 用テンプレート言語である「Lucius」で書くと、以下のようになります。

Cassius とは異なり、入れ子構造はインデントではなく「{ ... }」を使用します。

Lucius は CSS のスーパーセットなので、次のように CSS をそのまま記述することもできます。

Lucius で書く場合は、templates/hello.lucius という名前で作成します。

 

Julius (Javascript)

最後に Javascript 用のテンプレート言語、「Julius」を使用してみましょう。

templates/hello.julius を作成し、以下の内容を入力します。

ブラウザで確認すると、次のように表示されます。

yesod-hello4

 

まとめ

Handler の作成から、各種テンプレート言語まで見てきました。

テンプレート言語は 4 種類もあるのでややこしいですね。

とりあえず単純なページは作成することができるようになりました。

とはいえ、リクエストパラメータの扱い方や複数ページ間のリンク方法などはまだ知りません。

次回以降にぼちぼち調べていきたいと思います。

 

Enjoy Yesod!

 

Comments are closed, but you can leave a trackback: Trackback URL.