Следующее определение маршрута работает хорошо
sub load_routes {
my($self) = @_;
my $root = $self->routes;
$root->get('/')->to( controller=>'Snipgen', action=>'indexPage');
$root->any('/Snipgen') ->to(controller=>'Snipgen', action=>'SnipgenPage1');
$root->any('/Snipgen/show') ->to(controller=>'Snipgen', action=>'SnipgenPage2');
}
и "./script/snipgen.pl маршруты -v" дают
/ .... GET ^
/Snipgen .... * Snipgen ^/Snipgen
/Snipgen/show .... * Snipgenshow ^/Snipgen/show
но это не удается для http://127.0.0.1:3000/Snipgen/, страница не найдена
sub load_routes {
my($self) = @_;
my $root = $self->routes;
$root->get('/')->to(controller=>'Snipgen', action=>'indexPage');
my $myaction = $root->any('/Snipgen')->to(controller=>'Snipgen', action=>'SnipgenPage1');
$myaction->any('/show') ->to(controller=>'Snipgen', action=>'SnipgenPage2');
}
и соответствующие маршруты "./script/snipgen.pl -v" дают
/ .... GET ^
/Snipgen .... * Snipgen ^/Snipgen
+/show .... * show ^/show
Все субтитры SnipgenPageXX имеют return; как их последняя строка. Есть идеи, что происходит не так?





В документации Mojolicious указано, что маршрут с детьми не может быть составлен сам по себе. Вы можете обойти это, добавив дочерний маршрут с помощью '/'. Другой вариант — использовать под(), что обеспечивает больший контроль за счет добавления цели отправки для частичного маршрута.
Как было предложено в комментариях Брайана Д. Фоя, вы можете отображать маршруты вашего приложения, передав параметр routes в скрипт вашего приложения следующим образом:
perl -Ilib script/my_app routes -v.
См. документацию здесь и здесь.
Шаблон Mojolicious «Страница не найдена» также отображает ваши маршруты вверху страницы.
Вы хотите, чтобы маршруты выглядели так:
/ .... * ^
/Snipgen .... * Snipgen ^/Snipgen
+/ .... * ^
+/show .... * show ^/show
Вместо:
/ .... * ^
/Snipgen .... * Snipgen ^/Snipgen
+/show .... * show ^/show
Добавление ребенка с помощью '/':
sub load_routes {
my($self) = @_;
my $root = $self->routes;
$root->any('/')->to(controller=>'Snipgen', action=>'indexPage');
my $myaction = $root->any('/Snipgen')->to(controller => 'Snipgen');;
$myaction->any('/')->to( action=>'SnipgenPage1');
$myaction->any('/show')->to( action=>'SnipgenPage2');
}
Используя under()
sub load_routes {
my($self) = @_;
my $root = $self->routes;
$root->get('/')->to(controller=>'Snipgen', action=>'indexPage');
my $myaction = $root->under('/Snipgen');#->to('Auth#check')
$myaction->any('/')->to(controller=>'Snipgen', action=>'SnipgenPage1');
$myaction->any('/show')->to(controller=>'Snipgen', action=>'SnipgenPage2');
}
Или добавьте дочерний маршрут следующим образом:
sub load_routes {
my($self) = @_;
my $root = $self->routes;
$root->get('/')->to(controller=>'Snipgen', action=>'indexPage');
my $myaction = $root->get('Snipgen')
->to(controller=>'Snipgen', action=>'SnipgenPage1')
->add_child(Mojolicious::Routes::Route->new);
$myaction->get('show')->to(controller=>'Snipgen', action=>'SnipgenPage2');
}
Я так и не понял, что отображает «routes -v». Использование его здесь является хорошим примером: выходные данные различаются для двух случаев, но, насколько я могу судить, он по-прежнему говорит, что оба URL-адреса совпадают. Как он показывает, что ни один маршрут не соответствует URL-адресу?
@ferg По отступу и знаку + вы можете сказать, что Snipgen является промежуточным маршрутом и сам по себе не будет соответствовать.
Где описан вывод «routes -v»? Думаю, мне нужно знать, какой контроллер и действие или что-то еще запускается путем.
Если вы запустите
perl -Ilib script/myapp.pl routes -v, вы увидите, как моджо решает маршрутизировать вещи. Вы должны увидеть, что нет маршрута, соответствующего URL-адресу.