Play framework

小技集

他人様のアイディア、自身の発見などをまとめてみたいと。

目次

ルーティング

URLの末尾にスラッシュを自動追加する

  • 参考URL
http://blog.arahaya.com/2011/12/new-blog-running-on-play/
あらきさんのブログより「Play frameworkでブログを作ってみました」
  • 当たり前だがPlay!ではURL末尾のスラッシュ有無をちゃんとチェックする。
  • ユーザにしてみればどっちでも一緒なので、末尾スラッシュが無かった場合にはスラッシュ有URLへリダイレクトされるようにする。
  • URL末尾のスラッシュ有無の両方にマッチするように「/?」とすると、URLが2パターン存在してしまうこと、リバースルーティングでスラッシュ無が返されること、といった好ましくない動作になる。
  • routesファイル
    GET     /[^\.]+[^/]$    Helper.addSlash
    
  • controllerクラス
    public class Helper extends Controller {
        public static void addSlash() {
            redirect(request.url + "/");
        }
    }
  • これ以外のルーティングはスラッシュ有で定義しておく。

#{include /}で一回だけ読み込む

C言語でヘッダファイルを何度も読み込まないためのテクニックの Play!テンプレート版です。C言語の場合は下記のように記述しますよね。

#ifndef _mylib_h_
#define _mylib_h_

/* 本文 */

#endif

"_mylib_h_"が未定義ならヘッダの /* 本文 */ を読み込み、定義済なら無視するという仕組み。

これをPlay!のテンプレートエンジンで実現しようとすると下記のようになります。

#{get '_mylib_h_'}

<!-- 本文 -->

#{/get}
#{set _mylib_h_:'' /}

#{get}で "_mylib_h_" という変数の出力を試み、未定義ならばタグで挟まれた <!-- 本文 --> が出力されます。 その後、#{set}で "_mylib_h_"変数の中身を空にしておきます。

こうすることで次の読込では "_mylib_h_"変数は定義済。変数の中身は空っぽなので何も出力されないことになります。

本文のサイズが大きいとちょっと気が引けますが、すぐに変数を空にしているので多分、大丈夫でしょう。

#{include /}でファイルが存在しない場合への対処

  • 通常、includeタグでは静的にファイル名を指定するが、変数を使って動的に指定することも出来る。
  • その場合、ファイルが存在しないとレンダリング中にエラーとなってしまうため、ファイルが存在しない場合に備えておく必要がある。
  • ファイルが見つからないとTemplateNotFoundException例外が発生する。下記のように、try〜catchで挟んで例外を補足してしまえばいい。
    %{ try { %}
      #{include 'adm/'+type.name+'/list.custom.html' /}
    %{ } catch (play.exceptions.TemplateNotFoundException e) { }%
      ファイル読み込みできませんでした.
    %{ } }%

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-11-23 (金) 16:27:04 (2518d)