【问题标题】:perl dancer: passing database info to templateperl dancer:将数据库信息传递给模板
【发布时间】:2011-06-09 12:44:33
【问题描述】:

在此处跟随舞者教程:

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中出现?

* 更新 * 如果我将数据库代码更改为:

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 语法。

谢谢

布布诺夫

编辑/解决方案**

David 让我想起了 Data::Dumper,它确认问题确实出在模板配置上。我在配置文件中注释掉了模板指令,认为它是多余的,因为它在代码本身中。错误的!!!它必须在 YAML 中配置。在配置中删除 octothorpe 会将所有内容设置为权限。现在我只是因为一开始就没有尝试 Data::Dumper 而感到尴尬。谢谢大卫!

【问题讨论】:

    标签: perl templates dancer


    【解决方案1】:

    首先,确保您将您认为要传递给模板的内容传递给模板。

    将 $sth->fetchall_hashref($key_field) 的结果分配给一个临时标量,然后用 Data::Dump 或 Data::Dumper 转储它(或参见Dancer::Plugin::DebugDump 以了解使其变得非常简单的方法)。

    【讨论】:

    • Data::Dumper 显示预期的数据正在作为散列传递。正如预期的那样。我在想我的模板配置有问题。也许它正在尝试使用简单的模板而不是模板工具包。它是直接在代码中配置的。
    • 我正在考虑绕过框架,而不是尝试破译模板特性。我可以将它序列化为 JSON 并进行 ajax 调用,而不是与框架作斗争。
    • 感谢您的帮助 David -- 这是模板配置。即使它是在代码顶部配置的,也必须在 YAML 配置中进行设置。奇怪的是,简单的解决方案如何从仇恨中带来幸福。确认传递的数据将问题缩小到模板和最终的罪魁祸首。
    • 不客气,很高兴看到你把它整理好了。我将尝试重现您看到的问题,其中使用setting 在运行时而不是在配置文件中选择模板引擎不起作用,因为它应该起作用!通过一个非常基本的测试用例,它确实像我预期的那样工作:gist.github.com/796692
    • 啊哈-该测试用例有效,但是如果我添加一个 config.yml 文件,即使只包含 appname: Test,它也会停止工作。您在 Dancer 中发现了一个错误,我刚刚为其打开了一个问题,应该很快就会修复 - 感谢您找到它!在github.com/sukria/Dancer/issues/issue/265 上打开问题
    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2014-05-20
    相关资源
    最近更新 更多