Mojolicous::LiteとDBIx::Skinnyで簡易掲示板を作ってみた

今回はオンラインPerl勉強会の22回のお題についてDBIx::Skinnyを使って書いてみます。

DBIx::Skinny昨年のJPerl Advent Calendarを参考にしてみました。

データベースを用意する。

今回はオンライン勉強会と同じSQLiteを使って書いています。
シンプルに以下のようなテーブル。

$ sqlite3 bbs.db
$ create table bbs(title text primary key not null, message text);

コーディング

使い方が間違っているかもしれませんが、以下のように書いてみました。

#!/usr/bin/env perl

package BBS::Model;
use DBIx::Skinny;
1;

package BBS::Model::Schema;
use DBIx::Skinny::Schema;

install_table bbs => schema {
    pk 'title';
    columns qw/title message/;
};

# これを入れると日本語も可
install_utf8_columns qw/title message/;

1;

package main;
use Mojolicious::Lite;

my $db = BBS::Model->new({dsn => 'dbi:SQLite:bbs.db'});

post '/post' => sub {
    my $self = shift;
    my $title = $self->param('title') || '';
    my $message = $self->param('message') || '';

    $db->create( 'bbs', {
        title    => $title,
        message  => $message
    });

    $self->redirect_to('index');
} => 'post';

get '/' => sub {
    my $self = shift;

    my @results = $db->search('bbs', {});
    my $items = [];
    for my $row (@results) {
        my $item = {
            title   => $row->title,
            message => $row->message
        };
        push @$items, $item;
    }

    $self->render( items => $items );
} => 'index';

app->start;
__DATA__
@@ index.html.ep
<!doctype html><html>
    <head>
        <meta http-equiv = 'Content' content-type='text/html;charset=UTF-8' />
        <title>Mojo + DBIx::Skinny</title>
    </head>
    <body>
        <div id='header'>
            <h1>Mojolicious::Lite + DBIx::Skinny</h1>
        </div>
    <div id='form'>
        <%= form_for 'post' => (method => 'post') => begin %>
        Title: <%= text_field 'title' %><br/>
        Message: <%= text_area 'message' %><br/>
        <%= submit_button 'Post' %>
        <% end %>
    </div>
    <div id='bbs'>
        <% for my $row (@$items) { %>
        <dl>
          <dt class='title'><%= $row->{title} %></dt>
          <dd class='message'><%= $row->{message} %></dd>
        </dl>
        <% } %>
    </div>
    </body>
</html>

あとはCSSとかでレイアウト整えたりすれば極シンプルな掲示板ができるかと。