CFWheels -Перенаправить пользователя, если params.key не существует?

У меня есть базовое действие контроллера, которое выполняет findByKey(). URL-адрес будет выглядеть так:

/пин/показать/45

Однако, если «45» отсутствует (params.key), я хочу перенаправить их только на /pin/.

На данный момент, когда ключ не указан, кажется, что все еще отображается действие show со ВСЕМИ сообщениями. Я немного смущен этим.

Кроме того, если я проверяю действие show() для params.key, оно не работает должным образом; мое перенаправление не происходит ... хотя параметры дампа не отображаются, ключ отсутствует.

Вот мое действие 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

    );

}

Любая помощь будет оценена по достоинству!

Спасибо, Майкл.

Обновление:

Кажется, это может иметь какое-то отношение к маршрутам? Вот мои маршруты для булавки, ниже:

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/ и действие, но по-прежнему отображается /pin/show/ в URL-адресе.


person Michael Giovanni Pumo    schedule 09.07.2013    source источник
comment
Попадает ли код в ваше выражение if? Ключ определен, но пуст?   -  person Matt Busche    schedule 09.07.2013
comment
Код в операторе if никогда не выполняется, независимо от того, отображается ли params.key в структуре. Интересно, что когда я вывожу параметры, я вижу, что действие — это index. Таким образом, когда запись не найдена, она просто загружает действие по умолчанию, а не то, что мне нужно, поскольку URL-адрес все еще показывает /pin/show/   -  person Michael Giovanni Pumo    schedule 09.07.2013


Ответы (1)


Вы можете значительно исправить это с помощью инициализатора 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 и сопровождение серии скринкастов, потому что это делает многое из этого гораздо более тривиальным.

person Chris Peters    schedule 09.07.2013
comment
Привет Крис! Спасибо. Я использовал ваш код, но он по-прежнему не может выполнить код, когда ключ отсутствует. Единственный раз, когда он перенаправляет и отображает flash, это когда тип является строковым, а не числовым. Похоже, что приложение по-прежнему отображает действие /pin/show/ в URL-адресе, но загружает в него действие /pin/index/. Любая идея, почему это происходит? Является ли стандартным для колес откат к какому-то действию по умолчанию? - person Michael Giovanni Pumo; 09.07.2013
comment
Вы можете добавить еще один маршрут, который перехватывает pin/show без [key], и указать его на действие show. Вероятно, он возвращается к index, потому что отсутствие ключа приводит к тому, что он соответствует маршруту index. Если вам нужна дополнительная помощь, добавьте к своему вопросу соответствующие части route.cfm. - person Chris Peters; 09.07.2013
comment
Привет, Крис, я обновил свой первоначальный пост, чтобы показать свои маршруты на контроллере /pin/. Любая помощь будет оценена по достоинству. Мне это кажется прекрасным, но, возможно, это настолько очевидно, что я стал слеп к проблеме. - person Michael Giovanni Pumo; 09.07.2013
comment
Смотрите обновленный ответ. Вы можете повторить этот метод для всех маршрутов, у которых значение ключа может отсутствовать. - person Chris Peters; 09.07.2013
comment
Фантастический Крис! Как всегда, ты мне очень помог. Спасибо! Добавление дополнительного условия маршрута, казалось, привело к ожидаемому поведению. - person Michael Giovanni Pumo; 10.07.2013
comment
Здорово! Просто передаю знания после прослушивания Пера в течение многих лет. :) - person Chris Peters; 10.07.2013