如何将一些值传递给chicagoboss中的另一个动作?

时间:2012-12-10 04:45:34

标签: web-applications erlang chicagoboss

我写了一些这样的话:

login('POST', []) ->
    ....
            case Client:check_password(Req:post_param("password")) of
                true ->
                    {redirect, [{controller, "chat"}, {action, "live"}], [{username, Name}, {gender, Gender}]};
    ....
    end.

如何让聊天控制器中的实时动作收到姓名和性别信息? 我写道:

live('GET', [Req]) ->
   Name=Req:post_param("username"),
   ....
   {ok, [{username, Name}, {gender, Gender}]}

但它不起作用,任何人都可以帮助我>

1 个答案:

答案 0 :(得分:0)

您在重定向中所做的事情很可能不是您想要的。

如果您检查the controller API documentation,您会注意到第二个proplist引用了请求标头,而不是参数({redirect, Location, Headers::proplist()})。这意味着您可以像live/2一样访问Req:header("HEADERNAME")中的值。

其次,在您的live/2控制器功能的定义中,您假设您已捕获了一个URL参数(您引用为Req)。这不会反映在login控制器功能的重定向中。因此,您可以做的是将live/2的定义更改为live('GET', [Username, Gender]),这意味着您必须将其称为/live/a-username/the-users-gender,然后将重定向更改为{redirect, [{controller, "chat"}, {action, "live"}, {username, Name}, {gender, Gender}]}

但是,我建议你改用会话。在控制器上实现before_/1方法,并确保模块定义包含request和session_id参数(选中the documentation)。现在,您可以使用会话API传递任何与会话相关的值(它还具有清理控制器功能的好处 - 添加第三个参数,并简单区分基于before_/1结果的请求)。 / p>

例如,您可以拥有:

live('GET', [], undefined) -> 
    % redirect to the login page
live('GET', [], UserObject) ->
    {ok, [{username, UserObject:username()}, {gender, UserObject:gender()}]}.