タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

アクションの結果の返し方によって、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インスタンスであればビルド、とうコードになっている。