1

私はバグに苦しんでいます、それは私が特定することができません。

郵便番号を受け取り、ルックアップを実行し、緯度、経度、および地域名を返す関数があります。

たとえば、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(ビューの一部)の内部から取得されたものです。

では、何が起こっているのか、どこから始めればよいのか、何か考えはありますか?これをさらにデバッグするために何ができますか?私はアイデアがありません。

4

2 に答える 2

0

$areaが祝福されたオブジェクトだからかもしれません。これを試して、スカラー文字列に変換してください。

$string = ''.$area;
# e.g.
$hash->{'area'} = ''.$area;

@Moritzのコメントに続いて、$ areaが祝福されていることを確認するには:

print ref($area);
use Data::Dumper; warn Dumper($area);

そしてq{""}がオーバーロードされました:

print defined ${ref($area).'::'}{'(""'};

編集

サブリリースは-$postcodeがfalseと評価された場合はundef-リストを返すことができますが、スカラーコンテキストとして使用されるため、括弧で囲まれたリスト(コンマ式)のように最後の引数$region_nameを返します

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 );  
  }
}

$region_nameまたは$areaをダンプするか、from_postcodeを確認することに関連します。

于 2012-11-05T14:04:41.940 に答える
0

他の開発サーバーと本番サーバーで問題が解決したことがわかりました。

したがって、TTをアンインストールして再インストールしようとしましたが、それは役に立ちませんでした。

どうやらそれは私の開発サーバーの環境問題であるように思われるので、私はボックスを廃止して新しいボックスを開始しています。

于 2012-11-22T14:00:01.413 に答える