元フリーエンジニアライフ

Ruby on Rails とか MovableType とかAWSやってるフリーランスウェブエンジニアの記録でした。現在は法人成りしてIT社長。

アクションの結果の返し方によって、post_runコールバックの実行順が変わって嵌まったメモ

世界で今の僕ぐらいしか困ってないメモ。

build_pageしてテンプレートを処理して返すアクション(メソッド)と、テンプレート自体を返すアクションでは、template_param等のページ加工用コールバックと、post_runコールバックの実行順が変わる。

コールバックの実行順をアテにしてると死ぬ。そのようなコードはカオスになるので極力避けるべき。

サンプルコード

以下のコードはどちらも、Entryのコンテキストを持つ、テンプレートhoge.tmplを処理した結果を返すものだが、コールバックの実行順が異なる。

template_sourcetemplate_paramtemplate_outputpost_runtake_down

sub hoge {
    my $app = shift;
    # hoge
    $tmpl = $app->load_tmpl('hoge.tmpl');
    my $ctx = $tmpl->context;
    $ctx->stash( 'entry', $entry );
    return $app->build_page($tmpl);
}

post_runtemplate_sourcetemplate_paramtemplate_outputtake_down

sub hoge {
    my $app = shift;
    # hoge
    $tmpl = $app->load_tmpl('hoge.tmpl');
    my $ctx = $tmpl->context;
    $ctx->stash('entry', $entry);
    return $tmpl;
}

原因

MT::App::runで、アクション実行後を示す$app->post_run()が呼ばれた後に、戻り値がMT::Templateインスタンスであればビルド、とうコードになっている。