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, }); ....
とします。これで以下のような画面になります。
まだ、/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',
これで投稿もできるようになりました。
番外 (もっと便利にデバックできるために)
コードの修正で失敗したりと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
- Plack::Middleware::StackTrace