2013-07-09 3 views
0

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

/контакт/шоу/45

Однако, если '45' это нет (params.key), я хочу, чтобы перенаправить их просто/контакт /.

В настоящий момент, когда не указан ни один ключ, он все равно отображает действие шоу со всеми сообщениями. Я немного смущен этим.

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

Вот мое шоу() Действие:

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 

    ); 

} 

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

Thanks, Michael.

Update:

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

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/index/controller и action, но все еще показывает/pin/show/в URL.

+0

Включает ли этот код в ваш оператор if? Определен ли ключ, но пустой? –

+0

Код в инструкции if никогда не выполняется, независимо от того, отображается или нет params.key в структуре. Интересно, однако, когда я выдаю параметры, я вижу, что действие является индексом.Так что почти так, как если бы запись не была найдена, она просто загружает действие по умолчанию - не то, что я хочу, поскольку URL-адрес все еще показывает/pin/show/ –

ответ

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() в зависимости от того, что ему нужно беспокоиться, а другие механизмы в контроллере могут беспокоиться о проверке параметров.

Update

Взгляните на 2-й линии, которые я добавил в:

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 plugin и accompanying screencast series, потому что он делает много этого материала более простым.

+0

Привет Крис! Благодарю. Я использовал ваш код, но он все еще не выполняет код, когда отсутствует ключ. Единственный раз, когда он перенаправляет и отображает вспышку, это когда тип имеет строку, а не цифровую. Похоже, что приложение все еще отображает/pin/show/action в URL, но загружает/pin/index/action в это. Любая идея, почему это происходит? Является ли стандартом для колес для отказа от какого-либо действия по умолчанию? –

+0

Возможно, вы захотите добавить еще один маршрут, который ловит 'pin/show' без' [key] 'и укажет на действие show. Вероятно, он возвращается к 'index', потому что отсутствие ключа вызывает его соответствие маршруту' index'. Если вам нужна дополнительная помощь, добавьте соответствующие части вашего 'route.cfm' к вашему вопросу. –

+0

Привет Крис, я обновил свой первоначальный пост, чтобы показать свои маршруты на/pin/controller. Любая помощь будет оценена по достоинству. Это выглядит хорошо для меня, но, возможно, это настолько очевидно, что я стал слепым к проблеме. –

Смежные вопросы