「シンプルなWebアプリを今、自分なりに書いてみる」を Mojolicious 4.0 に対応させてみた。

シンプルなWebアプリを今、自分なりに書いてみる」が 2013年5月にリリースされた 4.0 に対応していないので、自分なりに書き直してみた。
修正したのは、Mojolicious::Controller で廃止された API を修正した。

#!/usr/bin/perl
use Mojolicious::Lite;
use HTML::FillInForm::Lite;
use FormValidator::Lite;
use utf8;

get '/' => sub {
    my $self = shift;
    $self->stash->{error_messages} = undef;
    $self->render('index');
};

post '/' => sub {
    my $self = shift;
    my $validator = FormValidator::Lite->new($self->req);

    $validator->set_message(
        'zip.not_null' => '郵便番号が空です。',
        'zip.length'   => '郵便番号が正しくありません。',
        'zip.uint'     => '郵便番号が正しくありません',
    );

    my $res = $validator->check(
        zip => ['NOT_NULL', 'UINT', ['LENGTH' => 7]],
    );

    my @error_messages = ();

    if ($validator->has_error) {
        for my $message ($validator->get_error_messages) {
            push @error_messages, $message;
        }

        $self->stash->{error_messages} = \@error_messages;
        # 下記を修正
        my $html = $self->render('index', partial => 1);

        # 下記を修正
        $self->render(
            text => HTML::FillInForm::Lite->fill(\$html, $self->req->params),
            format => 'html'
        );
    } else {
        $self->stash->{zip} = $self->req->param('zip');
        $self->render('thankyou');
    }
};

app->start;

__DATA__

@@ index.html.ep
% layout 'default';
<p>郵便番号を7桁の数字で入力してください。</p>
% if ($error_messages) {
% for my $message (@$error_messages) {
<p><b style="color:red;"><%= $message %></b></p>
% }
% }
<form action="/" method="post">
  <input type="text" name="zip" maxlength="7" size="7"/>
  <input type="submit" value="送信" />
</form>

@@ thankyou.html.ep
<p>正常に入力されました。郵便番号は「<%= $zip %>」です。<br />ありがとうございます。</p>
<p><a href="/">戻る</a></p>

@@ layouts/default.html.ep
<!DOCTYPE html>
<html>
  <head><title><%= title %></title></head>
  <body><%= content %></body>
</html>

わずか1年半前のサンプルコードが動かなくなるなんて、変化の速さに改めて驚く。