В приложении Mojolicious я использую шаблоны для генерации XML для запросов к веб-службам Exchange.
В одном случае я должен выполнить два цикла запроса template => один за другим, и похоже, что во втором вызове содержимое первого вызова объединяется с содержимым второго, искажая результаты.
Это решится, если я установлю поле mojo.content
тайника в пустую строку после того, как я отрендерил вещи (см. «ПОЧЕМУ ЭТО НУЖНО» в первом фрагменте.
Почему это? Код следует (откорректировано для ясности, я надеюсь).
В одной упаковке:
use Mojo::Base 'Mojolicious::Plugin';
sub user_location {
my ($self, $c, $name) = @_;
my $url = Mojo::URL->new($c->app->config->{root});
my $xml = $c->render_to_string(template => 'xml/whois', format => "xml", name => $name);
#----------------------
# WHY IS THIS NEEDED?
#----------------------
$c->stash->{'mojo.content'} = undef;
my $ua = Mojo::UserAgent->new();
my $tx = $ua->post($url => {'Content-Type' => 'text/xml', 'Accept-Encoding' => 'None' } => $xml);
if ($tx->res->is_success) {
# do things
# return result
}
}
В другой упаковке:
use Mojo::Base 'Mojolicious::Controller';
sub get_freebusy {
my $c = shift;
my $loc = $c->user_location;
my $tx = $c->get_ews('xml/calendar');
if ($tx->res->is_success) {
# do things
# return result
}
}
и еще один пакет:
sub register {
my ($self, $app, $conf) = @_;
$app->helper('get_ews' => sub {
my $c = shift;
my $template = shift;
my $url = Mojo::URL->new($c->app->config->{root});
my $ua = Mojo::UserAgent->new();
my $xml = $c->render_to_string(template => $template, format => "xml");
my $tx = $ua->post($url => {'Content-Type' => 'text/xml', 'Accept-Encoding' => 'None' } => $xml);
if ($tx->res->is_success) {
unless ($tx->res->dom->at('ResponseCode')->all_text eq 'NoError') {
$tx->res->code(500);
}
} else {
# handle error
}
return $tx;
});
}