CFWheels - 如果params.key不存在,则重定向用户?

时间:2013-07-09 11:38:58

标签: coldfusion railo cfwheels

我有一个基本的控制器动作,它执行findByKey()。该网址如下所示:

/销/显示/ 45

但是,如果'45'不存在(params.key),我想将它们重定向到/ pin /.

此刻,当没有指定任何键时,它似乎仍显示所有帖子的显示操作。我对此感到有点困惑。

另外,如果我检查params.key的show()操作,它不能按预期工作;我的重定向不会发生......即使倾倒params,也没有显示密钥。

这是我的show()动作:

public void function show() {

    if( !structKeyExists(params, "key") ) {

        flashInsert( messages = [{ messageString="Key is required.", messageType="error" }] );
        redirectTo(route="pin");

    }

    param name="params.page" default="1";
    param name="params.pageQuantity" default="10";

    pins = model("pin").findByKey(

        key         = params.key,
        returnAs    = "query",
        include     = "user", 
        order       = "createdat DESC",
        page        = params.page,
        perPage     = params.pageQuantity

    );

}

任何帮助将不胜感激!

谢谢, 迈克尔。

更新

这似乎与路线有关?以下是我的pin路线,如下:

addRoute(name="pinShow",        pattern="pin/show/[key]",       controller="pin",       action="show");
addRoute(name="pinEdit",        pattern="pin/edit/[key]",       controller="pin",       action="edit");
addRoute(name="pinDelete",      pattern="pin/delete/[key]",     controller="pin",       action="delete");
addRoute(name="pinUpdate",      pattern="pin/update",           controller="pin",       action="update");
addRoute(name="pinNew",         pattern="pin/new",              controller="pin",       action="new");
addRoute(name="pinCreate",      pattern="pin/create",           controller="pin",       action="create");
addRoute(name="pinWanted",      pattern="pin/wanted",           controller="pin",       action="wanted");
addRoute(name="pin",            pattern="pin",                  controller="pin",       action="index");

现在,很多这些路线看似毫无意义,因为它们使用与没有路线时相同的URL模式,但计划将来更改这些路线。

当我点击/ pin / show /,没有键时,它似乎加载在/ pin / index / controller和action中,但仍在URL中显示/ pin / show /。

1 个答案:

答案 0 :(得分:2)

您可以使用verifies()初始化程序显着清理它。

function init() {
  verifies(
    only        = "show",
    params      = "key",
    paramsTypes = "integer",
    handler     = "handleInvalidShowParams"
  );
}

function show() {
  param name="params.page" default="1";
  param name="params.pageQuantity" default="10";

  pins = model("pin").findByKey(
    key      = params.key,
    returnAs = "query",
    include  = "user", 
    order    = "createdat DESC",
    page     = params.page,
    perPage  = params.pageQuantity
  );
}

private function handleInvalidShowParams() {
  flashInsert( messages = [{ messageString="Key is required.", messageType="error" }] );
  redirectTo(route="pin");
}

如您所见,我们添加一项检查以确保key存在并且是一个整数。如果其中任何一个测试失败,控制器就会运行handleInvalidShowParams(),它可以执行您需要的任何操作。

这使show()的范围保持在需要担心的范围内,控制器中的其他机制可能会担心参数验证。

<强>更新

看一下我添加的第二行:

addRoute(name="pinShow",   pattern="pin/show/[key]",   controller="pin", action="show");
addRoute(name="pinShow",   pattern="pin/show",         controller="pin", action="show");
addRoute(name="pinEdit",   pattern="pin/edit/[key]",   controller="pin", action="edit");
addRoute(name="pinDelete", pattern="pin/delete/[key]", controller="pin", action="delete");
addRoute(name="pinUpdate", pattern="pin/update",       controller="pin", action="update");
addRoute(name="pinNew",    pattern="pin/new",          controller="pin", action="new");
addRoute(name="pinCreate", pattern="pin/create",       controller="pin", action="create");
addRoute(name="pinWanted", pattern="pin/wanted",       controller="pin", action="wanted");
addRoute(name="pin",       pattern="pin",              controller="pin", action="index");

我相信没有密钥就会捕捉/pin/show模式。

作为额外的功劳,我可能会建议您查看ColdRoute pluginaccompanying screencast series,因为它会使这些内容变得更加微不足道。