Можно ли переписать данные ответа в Mojo :: Message :: Response? - PullRequest
2 голосов
/ 09 февраля 2012

В приложении Mojolicious в коде моего контроллера есть маршрут, подобный следующему:

/account/:id/users

Часть маршрута / account /: id содержит следующие данные, когда я добираюсь до пользователейчасть цепочки:

$VAR1 = { 
    'signup_ip' => '172.17.5.146', 
    'z_id' => '382C58D8-529E-11E1-BDFB-A44585CCC763', 
    'signup_date' => '2012-03-12T12:11:10Z', 
    'name' => 'Some Cool Account Name', 
    'users' => [ 
        { 
            'user_id' => '382C67EC-529E-11E1-BDFB-A44585CCC763' 
        } 
    ], 
    'account_id' => '382C67EC-529E-11E1-BDFB-A44585CCC763',
}; 

В пользовательской части цепочки я получаю хэш, используя $ self-> tx-> res-> content-> get_body_chunk (0)

sub users { 
    my $self = shift; 
    my $user_list = from_json( $self->tx->res->content->get_body_chunk(0) );    
    $self->respond_to( json => $user_list->{users} );
} 

Проблема, с которой я столкнулся, заключается в том, что я хочу перезаписать ответ только с помощью arrayref пользователей.Код выше в sub users () {} этого не делает.То есть, когда я выкидываю результат теста, я все равно получаю весь хэш.$ User_list - это ссылка на массив, которую я ищу в users (), но я не могу перезаписать ее.

У кого-нибудь есть идеи, как это сделать?

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Хмм. Думаю, я поставил свой предыдущий ответ не там, где нужно.Итак, вот оно:

В приложении я добавил следующие маршруты:

my $base = $r->bridge('/account/:id')->to('account#read');
$base->route('/')->via('get')->to('account#index');
$base->route('/users')->via('get')->to('account#users');

В Acount.pm

sub read {
    my $self = shift;
    # do stuff

    $self->stash->{account} = $data;   # set the stash

    return 1;     #return 1.  Don't render.
}

sub index {
    my $self = shift;
    my $data = $self->stash('account');  #get the stash 

     $self->render_json( $data );
}

sub users {
    my $self = shift;
    # do stuff

    my $data = $self->stash('account');
    $self->render_json( $data );
}

При этом устанавливается результат / account/: идентификатор в тайник в читаемом сабе.Установка маршрута в $ base-> route ('/') -> через ('get') -> to ('account # index');вызывает вызовы / account /: id из индекса index.

Маршрут $ base-> route ('/ users') -> via ('get') -> to ('account #users ') вызывает вызовы / account /: id / users из подпрограммы users.

0 голосов
/ 09 февраля 2012

Я думаю, вы должны предоставить различные параметры для метода respond_to.Я ожидаю, что это сработает:

$self->respond_to(json => { json => $user_list->{users} });

Или просто позвоните render_json:

$self->render_json($user_list->{users});

Редактировать: Я сделал простой сценарий тестирования, который работает для меня (используя последний вариант выше):

use Mojolicious::Lite;

get '/account/users' => sub {
    my $self = shift;
    my $user_list = {
        'signup_ip'   => '172.17.5.146',
        'z_id'        => '382C58D8-529E-11E1-BDFB-A44585CCC763',
        'signup_date' => '2012-03-12T12:11:10Z',
        'name'        => 'Some Cool Account Name',
        'users' => [{'user_id' => '382C67EC-529E-11E1-BDFB-A44585CCC763'}],
        'account_id' => '382C67EC-529E-11E1-BDFB-A44585CCC763',
    };
    $self->render_json($user_list->{users});
};

app->start;

запрос к http://localhost:3000/account/users вернул это:

[{"user_id":"382C67EC-529E-11E1-BDFB-A44585CCC763"}]
...