Jquery Cakephp:Ajax请求进入到动作it';在指定另一个url时从调用

Jquery Cakephp:Ajax请求进入到动作it';在指定另一个url时从调用,jquery,routing,cakephp-2.0,Jquery,Routing,Cakephp 2.0,我很抱歉标题不太合适,但是我在描述我的问题时遇到了麻烦,没有显示一些代码 我有一个操作-edit_one-在routes.php中定义如下: Router::connect('/edit_one/:ad_id', array('controller' => 'ads', 'action' => 'edit_one')); $.ajax({ url: "delete_from_facebook", type: "POST", data:

我很抱歉标题不太合适,但是我在描述我的问题时遇到了麻烦,没有显示一些代码

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

Router::connect('/edit_one/:ad_id', array('controller' => 'ads', 'action' => 'edit_one'));
$.ajax({
        url: "delete_from_facebook",
        type: "POST",
        data: data,
        success: function (res) {
            console.log(res);
       }
       });
Router::connect('/delete_from_facebook', array('controller' => 'ads', 'action' => 'deleteFromFacebook')); 
Router::connect('/add', array('controller' => 'ads', 'action' => 'add'));
正如您所看到的,它接受一个参数-ad_id

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

Router::connect('/edit_one/:ad_id', array('controller' => 'ads', 'action' => 'edit_one'));
$.ajax({
        url: "delete_from_facebook",
        type: "POST",
        data: data,
        success: function (res) {
            console.log(res);
       }
       });
Router::connect('/delete_from_facebook', array('controller' => 'ads', 'action' => 'deleteFromFacebook')); 
Router::connect('/add', array('controller' => 'ads', 'action' => 'add'));
url“delete_from_facebook”在routes.php中定义如下:

Router::connect('/edit_one/:ad_id', array('controller' => 'ads', 'action' => 'edit_one'));
$.ajax({
        url: "delete_from_facebook",
        type: "POST",
        data: data,
        success: function (res) {
            console.log(res);
       }
       });
Router::connect('/delete_from_facebook', array('controller' => 'ads', 'action' => 'deleteFromFacebook')); 
Router::connect('/add', array('controller' => 'ads', 'action' => 'add'));
控制器中的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);
    }
}
我的问题是,如果url是相对的,ajax请求将始终发布到编辑操作。如果提供的url是绝对url,它将发布到deleteFromFacebook函数

我知道原因。这是因为edit_one操作需要一个参数。我已经尝试过了,但是没有,那么ajax请求将转到正确的位置。我使用来自视图的相同ajax请求制作广告,这在routes.php中定义如下:

Router::connect('/edit_one/:ad_id', array('controller' => 'ads', 'action' => 'edit_one'));
$.ajax({
        url: "delete_from_facebook",
        type: "POST",
        data: data,
        success: function (res) {
            console.log(res);
       }
       });
Router::connect('/delete_from_facebook', array('controller' => 'ads', 'action' => 'deleteFromFacebook')); 
Router::connect('/add', array('controller' => 'ads', 'action' => 'add'));
正如您从路由中看到的,add.ctp和edit_one.ctp位于同一文件夹中。一个相对路径应该在两者中都起作用


我必须有参数,并且必须使用相对路径。如何才能将ajax请求发送到正确的位置?

ajax请求发送到的url完全取决于您的jquery代码。它与CakePHP路由无关。停止在jquery代码中使用相对url,问题就消失了。一种常见的合理方法是将应用程序的基本路径放在js变量中,然后将该变量附加到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);
       }
});
//在所有页面或所有页面的js文件加载顶部
var baseUrl=“/”;//或“/子文件夹/”
$.ajax({
url:baseUrl+“从facebook上删除”,
类型:“POST”,
数据:数据,
成功:功能(res){
控制台日志(res);
}
});

你对混合使用php和js有怀疑吗?因为我通常用js中的url做的是添加,但也许你想要另一个更优雅的解决方案…谢谢你的回复。是的,我宁愿用另一种方式来弄清这件事的真相。这似乎是一个相当奇怪的问题。感谢您的回复,但这一定与CakePHP有关。正如我所说的,我已经测试了完全相同的ajax请求,在路由中没有参数,并且来自放置在同一文件夹中的另一个视图文件,该文件夹不需要参数。没有其他变量改变。我对它进行了几次测试,结果是一致的:当需要参数时,它不起作用。如果不是这样,它就会起作用。我问这个问题的主要原因是因为这似乎是一个奇怪的问题,我想弄清为什么会发生这种情况。常见做法与否。使用
url:“从facebook删除”
检查浏览器控制台中调用的url,你就会知道原因。正如我所说,从facebook删除是路由的。这意味着它是另一个url的“别名”;baseurl(cakephp知道)+/ads/delete来自facebook。当需要参数时,控制台中的(控制器/操作):baseurl/one_edit/delete_from_facebook。不需要时:baseurl/从facebook中删除。我很抱歉,如果我在谈论相对URL时误导了你,那么从facebook上删除实际上是cakes路由提供的一个绝对的URL。尽管如此,如果我在jquery中编写绝对路径,它仍然可以工作,这对我来说非常奇怪。我会理解它是否与add.ctp一致,但不会。我现在看到您是cakePHP的核心贡献者,所以如果我光顾您,我很抱歉。我相信你知道你在说什么,但如果你能向我这样的新手解释一下,那就太好了。这一点我还不清楚。