2011-01-15 7 views
2

После Танцовщица учебник здесь:Perl танцора: проезжают информация базы данных в шаблон

http://search.cpan.org/dist/Dancer/lib/Dancer/Tutorial.pod

Я использую свою собственную базу данных sqlite3 с этой схемой

CREATE TABLE if not exists location (location_code TEXT PRIMARY KEY, name TEXT, stations INTEGER); 
CREATE TABLE if not exists session (id INTEGER PRIMARY KEY, date TEXT, sessions INTEGER, location_code TEXT, FOREIGN KEY(location_code) REFERENCES location(location_code)); 

Мой танцор код (helloWorld.pm) для базы данных:

package helloWorld; 
use Dancer; 
use DBI; 
use File::Spec; 
use File::Slurp; 
use Template; 

our $VERSION = '0.1'; 

set 'template' => 'template_toolkit'; 
set 'logger' => 'console'; 

my $base_dir = qq(/home/automation/scripts/Area51/perl/dancer); 

# database crap 
sub connect_db { 
my $db = qw(/home/automation/scripts/Area51/perl/dancer/sessions.sqlite); 
my $dbh = DBI->connect("dbi:SQLite:dbname=$db", "", "", 
    { RaiseError => 1, AutoCommit => 1 }); 
return $dbh; 
} 

    sub init_db { 
my $db = connect_db(); 
my $file = qq($base_dir/schema.sql); 
my $schema = read_file($file); 
$db->do($schema) or die $db->errstr; 
    } 

get '/' => sub { 
my $branch_code = qq(BPT); 
my $dbh = connect_db(); 
my $sql = q(SELECT * FROM session); 
my $sth = $dbh->prepare($sql) or die $dbh->errstr; 
$sth->execute or die $dbh->errstr; 
my $key_field = q(id); 
template 'show_entries.tt', { 
    'branch' => $branch_code, 
    'data' => $sth->fetchall_hashref($key_field), 
}; 
}; 

init_db(); 
true; 

Пробовал пример шаблона на сайт, не работает.

<% FOREACH id IN data.keys.nsort %> 
    <li>Date is: <% data.$id.sessions %> </li> 
<% END %> 

Производит страницу, но без данных. Как устранить эту проблему, поскольку никакие подсказки не входят в консоль/cli?

* UPDATE * Если изменить код базы данных для этого:

get '/' => sub { 
    my $branch_code = qq(BPT); 
    my $dbh = connect_db(); 
    my $sql = 'SELECT * FROM session'; 
    #my $sth = $dbh->prepare($sql) or die $dbh->errstr; 
    #$sth->execute or die $dbh->errstr; 
    #my $key_field = q(id); 
    my $entries = $dbh->selectall_arrayref($sql,{}); 
    template 'show_entries.tt', { 


'branch' => $branch_code, 
     #'data' => $sth->fetchall_hashref('id'), 
     'data' => @$entries, 
    }; 
}; 

я получаю один результат из таблицы в шаблоне. Таким образом, информация передается, но синтаксис для шаблона не работает, как описано. Это соответствует синтаксису Template Toolkit.

Благодаря

Bubnoff

EDIT/РАЗРЕШЕНИЕ **

Дэвид напомнил мне о данных :: Dumper, который подтвердил, что проблема действительно с конфигурацией шаблона. Я прокомментировал директиву шаблона в файле конфигурации, думая, что он будет лишним, поскольку он был в самом коде. НЕПРАВИЛЬНО!!! Он должен быть настроен в YAML. Удаление octothorpe в config устанавливает все права. Теперь я просто смущен тем, что не пытался использовать Data :: Dumper. Спасибо, Дэвид!

ответ

6

Прежде всего, убедитесь, что вы передаете то, что, по вашему мнению, переходите к шаблону.

Назначить результат $ sth-> fetchall_hashref ($ key_field) временному скаляру, а затем выгрузить его с помощью Data :: Dump или Data :: Dumper (или посмотреть Dancer::Plugin::DebugDump, чтобы облегчить его работу).

+0

Забыл о данных :: Дампер, спасибо, я попробую. – Bubnoff

+0

Вы поняли? –

+0

Данные :: Даммер показывает, что ожидаемые данные передаются как хэш. Как и ожидалось. Я думаю, что что-то не так с моей конфигурацией шаблона. Возможно, он пытается использовать шаблон простой, а не шаблонный инструментарий. Однако он сконфигурирован непосредственно в коде. – Bubnoff