Mojolicious::Liteでテンプレートに値を渡す

@nqounetです。

第5回はフォームを使えるようにしました が、何度も入力する場合にはブラウザの「戻る」ボタンを使う必要がありました。

今回は戻らなくても表示されるようにしてみましょう。

サンプルコード全体

Mojoliciousのバージョンは5.77で確認しています。

ファイル名はなんでも良いですが、ひとまずmyapp.plと考えてください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env perl
use Mojolicious::Lite;

get '/' => sub {
    my $c    = shift;
    my $user = $c->param('user');
    $c->stash(hello => qq{Hello $user!});
    $c->render(template => 'index');
};

app->start;
__DATA__
@@ index.html.ep

    <form action="/">
        <input name="user" type="text">
        <input type="submit" value="Submit!">
    </form>

<%= $hello %>

解説

Line 4 - 9

1
2
3
4
5
6
get '/' => sub {
    my $c    = shift;
    my $user = $c->param('user');
    $c->stash(hello => qq{Hello $user!});
    $c->render(template => 'index');
};

前回では、テンプレートを使う時に、文字列を渡しましたが、コードリファレンスの中でテンプレートを指定することもできます。

renderメソッドにtemplateとセットで文字列を渡すと、そのテンプレートが使用できます。

stashというメソッドは、テンプレートに値を渡したい時に使用できます。

stashメソッドに、テンプレートで使用する名前(今回はhello)と、値(今回はqq{Hello $user!} )を渡すと、テンプレートでは、スカラー変数として使うことができます。

Line 26

1
<%= $hello %>

stashで渡した値を実際に使用しているのがこちらです。

stashで渡した名前のスカラ変数を、``と%>で括ると、スカラ変数の値を表示することができます。

stashで使える名前

stashで使える名前にはいくつか制限があります。

予め他の用途で使っている名前があり、これらを使うと想定外の挙動をしますので使ってはいけません。

1
2
3
action, app, cb, controller, data, extends,
format, handler, json, layout, namespace,
path, status, template, text, variant

私もうっかりするとdatastatusを使ってしまってハマることがあります。気をつけましょう。

それと、(使うことはないと思いますが)mojo.で始まる名前も使えません。

ビューとコントローラー

これまでテンプレート、という表現をしていますが、フレームワークでは、このテンプレートを含めた表示する部分のことを「ビュー(view)」と呼んでいます。

そして、コードリファレンスの部分についても呼び方があり、こちらは「コントローラー(controller)」と呼びます。

stashを使うと、コントローラーからビューに値を渡すことができます。

ビューから考えると、ビューで使いたい値は、コントローラーからstashを使って渡す必要があります。

多機能だけど必要なところだけ使えばOK

コレまでは、テキストとして直接出力していましたが、stashを使ってコントローラーからビューへ値が渡せるようになりましたので、ビューを使ったHTMLで表示することができるようになりました。

皆さんも美味しいところだけをうまく使ってサクッとウェブアプリを作ってみましょう。

ところで、今月末(2015年2月28日)の土曜日にPerl入学式の第6回(今期の最終回)を開催します。

内容としては、何かしらのウェブアプリ(予定では1行掲示板)を作成します。

大阪の講師は私が担当する予定です。

あなたがまだ知らないPerlをお見せします。

お申し込みをお待ちしております。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。