0

findByKey() を実行する基本的なコントローラー アクションがあります。URL は次のようになります。

/ピン/ショー/45

ただし、「45」が存在しない場合 (params.key)、/pin/ だけにリダイレクトしたいと考えています。

現時点では、キーが指定されていない場合でも、すべての投稿で show アクションが表示されるようです。私はこれについて少し混乱しています。

また、params.key の show() アクションでチェックを行うと、期待どおりに動作しません。私のリダイレクトは起こりません...パラメーターをダンプしても、キーが存在しないことを示しています。

これが私の 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/ コントローラーとアクションに読み込まれるように見えますが、URL にはまだ /pin/show/ が表示されます。

4

1 に答える 1

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()これにより、心配する必要がある範囲が維持され、コントローラーの他のメカニズムはパラメーターの検証について心配することができます。

アップデート

私が追加した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 プラグインとそれに付随するスクリーンキャスト シリーズをご覧になることをお勧めします。

于 2013-07-09T13:11:36.650 に答える