Cakephp:Ajax-request转到从指定另一个url时调用的操作

时间:2013-04-23 14:04:00

标签: jquery routing cakephp-2.0

我很抱歉这个不同意的标题,但我在没有显示某些代码的情况下无法描述我的问题。

我有一个动作 - edit_one - 在routes.php中定义如下:

Router::connect('/edit_one/:ad_id', array('controller' => 'ads', 'action' => 'edit_one'));

正如您所看到的,它需要一个参数 - ad_id。

我在edit_one视图中有一个jQuery-ajax函数,如下所示:

$.ajax({
        url: "delete_from_facebook",
        type: "POST",
        data: data,
        success: function (res) {
            console.log(res);
       }
       });

网址'delete_from_facebook'在routes.php中定义如下:

Router::connect('/delete_from_facebook', array('controller' => 'ads', 'action' => 'deleteFromFacebook')); 

Controller中的deleteFromFacebook函数:

public function deleteFromFacebook() {
    $this->autorender = false;
    try {

        $this->log($this->request->data, 'debug');
        $response = $this->fb_handler->deletePhotoFromFacebook($this->fb, $this->request->data['id']);
        $this->log($response, 'debug');

        return new CakeResponse(array('body' => json_encode($response)));
    } catch (FacebookApiException $fbe) {
        $this->showFacebookAPIException($fbe);
    } catch (Exception $e) {
        $msg = __('An error has occured while uploading images. Please try again.');
        $this->showException($e, $msg);
    }
}

我的问题是,如果网址是相对的,则ajax-request将始终发布到edit_one操作。如果提供的URL是绝对的,它将发布到deleteFromFacebook函数。

我知道这个的原因。这是因为edit_one动作需要一个参数。我没试过,然后ajax请求到了正确的地方。我在视图中使用相同的ajax-request来制作广告,该广告在routes.php中定义如下:

Router::connect('/add', array('controller' => 'ads', 'action' => 'add'));

从路径中可以看出,add.ctp和edit_one.ctp位于同一个文件夹中。相对路径应该同样适用于两者。

我必须有参数,我必须使用相对路径。我该怎么做才能让ajax-request发布到正确的位置?

1 个答案:

答案 0 :(得分:0)

ajax请求的url完全取决于你的jquery代码。它与CakePHP路由无关。在你的jquery代码中停止使用相对url,你的问题就消失了。一个常见的合理方法是在js var中包含应用程序的基本路径,然后将该var附加到js代码中使用的所有url字符串。例如

//At the top of a js file load in all your pages or in all page <head>
var baseUrl = "/";  // OR "/subfolder/"

$.ajax({
        url: baseUrl + "delete_from_facebook",
        type: "POST",
        data: data,
        success: function (res) {
            console.log(res);
       }
});