Нужна помощь с маршрутизацией в Mojolicious

У меня есть контроллер Pages с методом show и контроллер Auths с методом check. " метод, который возвращает 1, если пользователь аутентифицирован. У меня есть страница "по умолчанию" ("/profile").

Мне нужно перенаправить на /, если пользователь аутентифицирован, и перенаправить все страницы на / с формой авторизации, если пользователь не аутентифицирован. Мой код не хочет работать должным образом (авторизация на основе примера приложения FastNotes): (

auths#create_form - html-шаблон с формой авторизации.

    $r->route('/')       ->to('auths#create_form')   ->name('auths_create_form');
    $r->route('/login')      ->to('auths#create')    ->name('auths_create');
    $r->route('/logout')     ->to('auths#delete')    ->name('auths_delete');
    $r->route('/signup') ->via('get') ->to('users#create_form')   ->name('users_create_form');
    $r->route('/signup') ->via('post') ->to('users#create')    ->name('users_create');
    #$r->route('/profile') ->via('get') ->to('pages#show', id => 'profile') ->name('pages_profile');

    my $rn = $r->bridge('/')->to('auths#check');
    $rn->route        ->to('pages#show', id => 'profile') ->name('pages_profile');

 $rn->route('/core/:controller/:action/:id')
    ->to(controller => 'pages',
   action  => 'show',
   id   => 'profile')
    ->name('pages_profile');

 # Route to the default page controller
 $r->route('/(*id)')->to('pages#show')->name('pages_show');

person VeroLom    schedule 24.01.2011    source источник
comment
Не могли бы вы объяснить, что означает не хочет работать должным образом? Вы объяснили, что он должен делать, но не объяснили, что на самом деле происходит.   -  person mfontani    schedule 24.01.2011
comment
Вы уверены, что check() возвращает true, когда это предполагается?   -  person Øyvind Skaar    schedule 25.01.2011


Ответы (1)


Кажется, вы хотите, чтобы / отображал либо форму логина, ИЛИ страницу профиля. Приведенный выше код всегда будет отображать / как логин, потому что он сначала выполняет это условие маршрута, и ему все равно, аутентифицированы вы или нет.

Попробуйте изменить исходный маршрут на / (маршрут по умолчанию после моста не нужен).

my $r = $self->routes;
$r->get('/' => sub {
    my $self = shift;
    # Check whatever you set during authentication
    my $template = $self->session('user') ? '/profile' : '/login';
    $self->render( template => $template );
});

Пара замечаний по вашему примеру:

  • Гораздо проще помочь отладить проблемы, если вы используете Mojolicious::Lite для примера.
  • Попробуйте использовать under вместо bridge.
  • Попробуйте использовать $r->get(..) вместо $r->route(..)->via(..)

Надеюсь это поможет.

person CoffeeMonster    schedule 24.02.2011