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>