私はバグに苦しんでいます、それは私が特定することができません。
郵便番号を受け取り、ルックアップを実行し、緯度、経度、および地域名を返す関数があります。
たとえば、AD300を渡すと、42.6、1.55、ordinoなどが返されます。これは非常にうまく機能します。
この関数は次のように呼び出されます。
my ($lat, $lng, $area) = $object->release();
戻り値は問題なく、警告付きでperlで印刷できます
warn "Area $area, $rellat, $rellng";
これは正常に機能します。「エリアオルディーノ、42.6、1.55」
次に、これらの値の1つ、たとえば$ areaを取得し、それをデータのハッシュに追加して、TTを介して前処理されるWebページに渡します(他の変数のロードで正常に実行するため)。
通常の方法でハッシュに値を割り当てています。例:$ hash-> {'area'} = $ area;
ここから楽しみが始まります。TTの値を参照しようとすると、たとえば[%hash.area%] Webページに「Ordino」が出力されないので、配列参照をTTに渡したと言われます。
少しデバッグした後、ハッシュ変数hash.areaが、サブルーチン「release」から返された3つの値を保持する配列(TTによる)を何らかの形で参照していることがわかりました。つまり、TTによるとhash.area = [42.6、1.55、ordino]です。
つまり、Webページ内で値「Ordino」を取得するには、[%hash.area.2%]にアクセスする必要があります。
さらに、$ hash-> {'area'}を変数、$ lat、$ lng、または$ areaのいずれかに等しくなるように設定して、同じ動作を得ることができます。TTは、3つの変数すべてが同じ配列を参照していると考えています。あれは
$ lat = $ lng = $ area = [42.6、1.55、ordino]TTによる
これは奇妙なことです。変数をperlでうまく出力でき、それらは通常のように表示されます。配列ではありません。配列なしのダンパーでハッシュをダンプしようとしましたが、すべて問題ありません。しかし、どういうわけか、TTは配列を見つけています。それは私の頭をやっています。
サイトは非常に大きく、ページがたくさんあり、変数とハッシュをTT経由でWebページに常に渡しており、4年になります。私はこれを見たことがありません。他のページでは、「release」メソッドからまったく同じ出力を渡し、正しく処理されます。
私のTT処理コードは問題ではないと思いますが、以下が関係します。
my $tt = Template->new({
INCLUDE_PATH => [ @$template_directories ],
COMPILE_EXT => '.ttc',
COMPILE_DIR => '/tmp/ttc',
FILTERS => YMGN::View->filters,
PLUGIN_BASE => [ 'YMGN::V::TT::Plugins' ],
EVAL_PERL => 1
});
$self->{tt} = $tt;
$self->{template_directories} = $template_directories;
$self->{output} = $params->{output} || undef;
$self->{data} = $params->{data} || [];
上記は新しいttオブジェクトを作成し、「new」関数の一部です(以下を参照)。「データ」にはハッシュが含まれています。「出力」は、処理されたテンプレートをユーザーのブラウザに送信する準備ができている状態に保ちます。new(上記)と呼び、データを処理し、以下のコードで出力を作成します。
sub process {
my $self = shift;
my $params = shift;
if (!ref $self || !exists $self->{tt}) {
my $class = $self;
$self = $class->new($params);
}
if (!$self->{output}) {
die "You need to specify output";
}
delete $self->{error};
$self->y->utils->untaint(\$self->{template});
my $rv = $self->{tt}->process(
$self->{template},
$self->{data},
$self->{output},
binmode => ':utf8',
);
if (!$rv) {
warn $self->{tt}->error();
return {
error => $self->{tt}->error(),
};
}
return 0;
}
他にもたくさんのことが起こっているので、上記のすべては消毒されています。重要なのは、入ってくるデータが正しく見えることだと思います。これは、ttによって処理されている(処理の時点で)完全なデータの完全なダンプです。問題の原因は、バブル-> [*]-> {'release'}です(リリース==データ内の領域。関係のない理由で名前が変更されていることに注意してください)。ご覧のとおり、ダンパーはそれを文字列だと考えています。TTは他のすべてをうまく処理します。
data $VAR1 = {
'system' => {
system stuff
},
'features' => {
site feature config
},
'message_count' => '0',
'bubbles' => [
bless( {
'history' => [
{
'creator' => '73',
'points' => '10',
'screenname' => 'sarah10',
'classname' => 'Flootit::M::Bubbles',
'id' => '1378',
'updated' => '1352050471',
'type' => 'teleport',
'label' => 'teleport',
'class' => 'Flootit::M::Bubbles'
}
],
'creator' => '6',
'release' => 'Escaldes-Engordany',
'image' => 'http://six.flooting.com/files/833/7888.png',
'pop_time' => '1352050644',
'y' => $VAR1->{'y'},
'taken_by' => '0',
'city' => '3',
'title' => 'hey a new bubble',
'id' => '566',
'class' => 'Flootit::M::Bubbles',
'prize' => 'go for it kids'
}, 'Flootit::M::Bubbles' ),
bless( {
'history' => [
{
'creator' => '6',
'points' => '10',
'screenname' => 'sarah20',
'classname' => 'Flootit::M::Bubbles',
'id' => '1723',
'updated' => '1349548017',
'type' => 'teleport',
'label' => 'teleport',
'class' => 'Flootit::M::Bubbles'
},
{
'creator' => '6',
'points' => '5',
'screenname' => 'sarah20',
'classname' => 'Flootit::M::Bubbles',
'id' => '1732',
'updated' => '1349547952',
'type' => 'blow',
'label' => 'blow',
'class' => 'Flootit::M::Bubbles'
}
],
'creator' => '89',
'release' => 'Ordino',
'image' => 'http://six.flooting.com/files/1651/8035.png',
'pop_time' => '1351203843',
'y' => $VAR1->{'y'},
'taken_by' => '0',
'city' => '3',
'title' => 'test4',
'id' => '1780',
'class' => 'Flootit::M::Bubbles',
'prize' => 'asdfasdf dsadsasdfasdfasdf'
}, 'Flootit::M::Bubbles' ),
bless( {
'history' => [],
'creator' => '6',
'release' => 'Andorra la Vella',
'image' => 'http://six.flooting.com/files/1671/8042.png',
'pop_time' => '0',
'y' => $VAR1->{'y'},
'taken_by' => '0',
'city' => '3',
'title' => 'Pretty flowers, tres joli',
'id' => '1797',
'class' => 'Flootit::M::Bubbles',
'prize' => 'With lots of pretty pictures'
}, 'Flootit::M::Bubbles' ),
bless( {
'history' => [],
'creator' => '6',
'release' => 'Hillrise Ward',
'image' => 'http://six.flooting.com/files/1509/8003.png',
'pop_time' => '0',
'y' => $VAR1->{'y'},
'taken_by' => '0',
'city' => '3',
'title' => 'Test beats',
'id' => '1546',
'class' => 'Flootit::M::Bubbles',
'prize' => 'Sound great'
}, 'Flootit::M::Bubbles' )
]
};
処理後に出てくるのはこれです($ outputに)[%FOREACH floot INbubbles%]があります
ARRAY(0xfaf5d448)の周りに浮かんでいます。
[%floot.release%]からこれを[%floot.release.2%]にすると、正しい値が得られます。
他のすべてのフィールドは正しく参照できます-図を参照してください。
「バブル」をまとめるコードは次のとおりです。
my $bubbles = $y->model('Bubbles')->search(['type' => 'golden', 'image' => '!NULL',
'bubble_prizes' => ['p', { 'p.bubble' => 'self.id'}], ], {
order_by => '(created>CURRENT_DATE() AND thumbsup+thumbsdown<10) DESC, COALESCE(thumbsup,0)-COALESCE(thumbsdown,0) DESC, pop_time DESC',
count => 10,
fields => ['p.title as title', 'p.prize as prize', 'city', 'taken_by', 'pop_time', 'id', 'creator'],
});
for (my $i=0; $i<@$bubbles; $i++) {
# Find specified bubbles (see below for when not found here)
my ($rellat, $rellng, $area) = $bubbles->[$i]->release() ;
$bubbles->[$i]->{'release'} = $area;
}
}
次に、コントローラーは$bubbleを取得し、それをセッション/サイトデータとバンドルし、匿名ハッシュ内に配置して(上記のデータで確認できるように)、処理のために表示に渡します。
リリースのコードは次のとおりです。
sub release {
my $self = shift;
my $postcode = $self->y->model('Prizes')->find({bubble => $self->id})->postcode;
my ( $user_lat, $user_long, $region_name );
if($postcode)
{
( $user_lat, $user_long, $region_name ) = $self->y->api('Location')->from_postcode($postcode);
return ( $user_lat, $user_long, $region_name );
}
}
API :: Locationは非常に大きいですが、関連する行は次のとおりです。
$postcode_record = $self->y->model('GeoData')->find( {
source => "ALL_COUNTRIES_POSTCODES",
country => $country_code,
sourceid => $postcode, } );
return ( $postcode_record->latitude, $postcode_record->longitude, $postcode_record->town );
私が示したデータダンプは、TT.pm(ビューの一部)の内部から取得されたものです。
では、何が起こっているのか、どこから始めればよいのか、何か考えはありますか?これをさらにデバッグするために何ができますか?私はアイデアがありません。