2017-10-11 9 views
0

私はコンピュータテーブルを持つSQLiteデータベースを持っています。私はコンピュータのテーブルに2つの行があります。リクエストの結果がテンプレートツールキットに表示されない

すべてのコンピュータを取得し、結果をテンプレートツールキットテンプレートで表示したいと考えています。

これは Dancer2::Plugin::Auth::TinyDancer2::Plugin::DBIC

get '/listallmachine' => needs login => sub { 
    my $computerRs = schema('default')->resultset('Computer'); 
    my @computers = $computerRs->all; 
    template 'listmachine' => { 
     'title'  => 'Liste des machines', 
     'msg'  => get_flash(), 
     'computers' => \@computers 
    }; 
}; 

そして、テンプレート用を使用しています Dancer2 コントローラコード、次のとおりです。

[% FOREACH c IN computers %] 
    <tr> 
     <td>[% c.ip %]</td> 
     <td>[% c.uuid %]</td> 
    </tr> 
[% END %] 

設定ファイル:

# configuration file for development environment 

# the logger engine to use 
# console: log messages to STDOUT (your console where you started the 
#   application server) 
# file: log message to a file in log/ 
logger: "console" 

# the log level for this environment 
# core is the lowest, it shows Dancer2's core log messages as well as yours 
# (debug, info, warning and error) 
log: "core" 

# should Dancer2 consider warnings as critical errors? 
warnings: 1 

# should Dancer2 show a stacktrace when an 5xx error is caught? 
# if set to yes, public/500.html will be ignored and either 
# views/500.tt, 'error_template' template, or a default error template will be used. 
show_errors: 1 

# print the banner 
startup_info: 1 

plugins: 
     DBIC: 
     default: 
      dsn: dbi:SQLite:dbname=papt.db 

テンプレートには何も表示されません。何かお考えですか?

+1

'@ computers'の内容を確認しましたか? – Borodin

+0

はいこれは自分のコンピュータデータです:要求の結果。私がテンプレートを使用しない場合、それは仕事です... – Oneill

+0

私の答え(下記)が助けになると思ったが、ここではもっと進んでいるようだ。 Template Toolkitを削除してPerlコードで配列をループするだけでどうなりますか?テンプレートに '[%computers.size%]'を含めるとどうなりますか?または '[%computers.0%]'? –

答えて

2

@computersを参照する必要があります。

get '/listallmachine' => needs login => sub { 
    my $computerRs = schema('default')->resultset('User'); 
    my @computers=$computerRs->all; 
    template 'listmachine' => { 
     'title'  => 'Liste des machines', 
     'msg'  => get_flash(), 
     'computers' => \@computers, # Note: Take reference here. 
    }; 
}; 

更新: [OK]を、私は今、これを説明することができると思います。

コメントでは、get_flash()は「ハッシュマップ」(これは「ハッシュ」を意味します)を返します。 2つのキーと値のペア(one => 1two => 2)を持つハッシュを返すと仮定しましょう。

{ 
    title  => 'Liste des machines', 
    msg  => one => 1, two => 2, 
    computers => \@computers 
}; 

しかし、それはすべてちょうどフラットなリストだ:それはあなたがtemplateに送信ハッシュは次のようになりますことを意味します。 Perlはこのようにそれを解釈します:

{ 
    title  => 'Liste des machines', 
    msg   => 'one', 
    1   => 'two', 
    2   => 'computers', 
    \@computers => undef, 
}; 

あなたは何が起こったかと思いますか? get_flash()から返された複数の値のため、あなたのキーと値のペアはすべてアウトラインになっています。そして、あなたはもはやcomputersと呼ばれるハッシュキーを持っていません。そのためテンプレートはcomputersという変数を見つけることができません。もう存在しません。

修正がget_flash()から返されたハッシュへのリファレンスを取ることです。

{ 
    title  => 'Liste des machines', 
    msg  => { get_flash() }, 
    computers => \@computers 
}; 

参照がリストに平坦化されたハッシュを防ぐことができます。あなたのデータ構造は次のようになります。

{ 
    title  => 'Liste des machines', 
    msg  => { one => 1, two => 2 }, 
    computers => \@computers 
}; 

(Pedantically、問題はサブルーチンはハッシュを返さないということである - 彼らはリストを返すリストあなたはハッシュ変数に格納したときにのみ、ハッシュとなります。)

+0

あなたの答えをありがとう。私はこのソリューションを参照してテストしますが、うまくいきません...私のテンプレートはforeachが正しいと思いますか? – Oneill

0

私はこの問題を理解しました。これは私のget_flash()関数であり、実際には "msg"要素を削除すると表示はOKです。だから私の参照を忘れて、 "get_flash"関数が悪いです。助けてくれてありがとう。

+0

'get_flash()の呼び出しが複数の値を返す可能性はありますか? –

+0

get_flash()の戻り値はハッシュマップです。私はget_flashの戻り値を正しく使用していないと思う。しかし、現時点では動作しています:)ありがとうございました。 – Oneill

+0

'get_flash()'がハッシュを返す場合、テンプレートハッシュを入れる前にそれを参照する必要があります。 'msg => {get_flash()}'。 –

関連する問題