2

在 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() 中寻找的数组引用,但我无法覆盖它。

任何人都知道如何做到这一点?

4

2 回答 2

1

嗯,我想我把我之前的答案放在了错误的地方。所以这里是:

在应用程序中,我添加了以下路线:

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/:id 的结果设置到读取子中的存储中。将路由设置为 $base->route('/')->via('get')->to('account#index'); 导致从索引 sub 呈现对 /account/:id 的调用。

The route $base->route('/users')->via('get')->to('account#users') causes the calls to /account/:id/users to be rendered from the users sub.

于 2012-02-14T19:10:16.630 回答
0

我认为您必须为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"}]
于 2012-02-09T09:23:54.310 回答