2013-07-09 36 views
0

我有一個基本的控制器操作,它執行findByKey()。 URL可能看起來像:CFWheels - 如果params.key不存在,則直接使用用戶?

/銷/顯示/ 45

但是,如果 '45' 是不存在(的params.key),我想重定向他們剛剛/銷/。

此刻,當沒有指定鍵時,它似乎仍然顯示所有帖子的顯示操作。我對此有點困惑。另外,如果我在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/controller和action中,但仍顯示URL中的/ pin/show /。

+0

該代碼是否將其放入if語句中?定義的關鍵是空白嗎? –

+0

無論params.key是否顯示在結構中,if語句中的代碼都不會執行。有趣的是,當我拋出參數時,我看到這個動作就是索引。所以就好像當一個記錄沒有被發現時,它只是加載默認動作 - 不是我想要的,因爲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()的範圍保留在需要擔心的地方,控制器中的其他機制可能會擔心參數驗證。

更新

看看二號線,這是我在已經添加了:

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,因爲它使得很多這些東西變得更加微不足道。

+0

嗨,Chris!謝謝。我已經使用過你的代碼,但是當密鑰丟失時仍然無法執行代碼。重定向和顯示閃存的唯一時間是類型是字符串而不是數字。看起來應用程序仍然在URL中顯示/ pin/show/action,但將/ pin/index /動作加載到此目錄中。任何想法爲什麼發生這種情況?輪子在某種默認行爲上倒退是否標準? –

+0

您可能想要添加另一條路線,該路線在不帶'[key]'的情況下捕獲'pin/show'並將其指向show操作。它可能會回落到'index',因爲缺少密鑰會導致它匹配'index'路線。如果您需要更多幫助,請將「route.cfm」的相關部分添加到您的問題中。 –

+0

嗨克里斯,我已經更新了我的初始帖子,以顯示我的路線在/ pin/controller上。任何幫助,將不勝感激。這對我來說看起來很好,但也許這很明顯,我已經對這個問題失去了知覺。 –

相關問題