keisyuのブログ

最近めっきりエンジニアリングしなくなった厄年のおじさんがIT技術をリハビリするブログ。

Amon2を使ったアプリ開発 (その2)

前回 ( Amon2を使ったアプリ開発 - keisyuのブログ ) はDBI経由でMySQLからデータを引っ張ってくるところまでできました。今回はまず取り出したデータをHTML上で確認できるようにします。
Amon2は Text::Xslate をそのテンプレートエンジンに採用しています。lib/SimpleBBS/Web/View.pm にその初期化コードがあります。
私は TT2 compatible のテンプレート syntax が好みなのでそれに変更します.

   my $view = Text::Xslate->new(+{
        'syntax'   => 'TTerse',   # Kolon -> TTerse

この段階ですでにデフォルトのテンプレート tmpl/index.tx で :cascade 構文が効かなくなったので画面が崩れますがそれでOKです。
新規に tmpl/index.tt を新規に作成します

<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>

<form action="[% uri_for('/post') %]" method="post">
    <input type="text" name="body">
    <input type="submit" value="post">
</form>

[% FOR entry IN entries %]
    <li> [% entry.id %] : [% entry.body %] - [% entry.created_at %]
[% END %]

</body>
</html>

これをテンプレートとして指定するために lib/SimpleBBS/Web/Dispatcher.pm で

any '/' => sub {
    ...
    return $c->render('index.tt', {
        entries => \@entries,
    });
    ....

とします。これで以下のような画面になります。
f:id:keisyu:20140216221823j:plain:w300
まだ、/post のメソッドが定義されていませんので追記します。Dispacher.pm に以下のコードを追記します。

post '/post' => sub {
    my($c) = @_;
    $c->dbh->do( q[
        INSERT INTO entries (body) VALUES (?)
    ], undef, $c->req->param('body'));
    return $c->redirect('/');
};

これで投稿もできる。とおもいきや投稿すると「403 XSRF detected.」と表示されてしまいます。
basicのflavorだと XSRF の対応がデフォルトみたいですね。この辺も改めてあとで調べるとしてとりあえず無効にしときます。
lib/SimpleBBS/Web.pm の中のload_pluginから以下を削除と Dispacher.pm内のsessionに関する記述を削除します。

    '+SimpleBBS::Web::Plugin::Session',

これで投稿もできるようになりました。
f:id:keisyu:20140216224715j:plain:w300

番外 (もっと便利にデバックできるために)

コードの修正で失敗したりと500エラー等がでたときにWeb画面でバックトレースの画面が見えるようなプラグインPlackにあります。
また、実行のプロファイルが取れるプラグインplackに用意されていますplackのbuilder (script/simplebbs-server) の中に以下の2つを記述します

builder {
    ...
    enable 'Plack::Middleware::Debug';
    enable 'Plack::Middleware::StackTrace',force => 1;

上のDebugはモジュールがインストールされていませんのでcpanfileに requires 'Plack::Middleware::Debug'; を記述して carton install も必要です。これにてそれぞれ以下のようなプロファイルやバックトレースが出力されます。

  • Plack::Middleware::Debug

f:id:keisyu:20140216225613j:plain:w300

  • Plack::Middleware::StackTrace

f:id:keisyu:20140216225815j:plain:w300