2011-11-03 78 views
1

問題我敢肯定,這是我做錯了,但我似乎無法弄清楚。我正在使用backbone.js與我的其餘服務器(Philip Sturgeon的codeigniter restserver)交談。我在我的一個骨幹集合模型上運行了一個正常的model.destroy()。與backbone.js DELETE請求和codeigniter restserver(phils)

//a basic example 
tagCollection.at(5).destroy(); 

這將創建像URL的正確電話:

DELETE http://mydomain.com/index.php/tags/tag/id/12

當我得到我的 「tag_delete」 PHP函數內部,然後執行:

$this->delete('id'); 

這始終什麼也不返回我認爲這與backbone.js發送請求的方式有關,但沒有任何東西會跳出來。下面的細節。

骨幹正在發出「刪除」請求。從我REST_Controller方法

相關代碼:

function tag_delete() { 
    //delete the tag 
    $id = $this->delete('id'); //always empty 

    $result = $this->tag_model->delete($id); 

    if (! $result) { 
     $this->response(array('status' => 'failed'), 400); 
    } 

    $this->response(array('status' => 'success'), 200); 
} 

任何想法?當使用codeigniter和Philip Sturgeon的restserver時,任何backbone.js專家都會遇到這種情況?

回答

2

這應該是一個廉價快速的方法來解決您的刪除請求......

function tag_delete() { 

    $id = $this->uri->segment(4); 

    $result = $this->tag_model->delete($id); 

    if (! $result) { 
      $this->response(array('status' => 'failed'), 400); 
    } 

    $this->response(array('status' => 'success'), 200); 
} 

然而,這是怎麼了,我使用骨幹和REST_Controller的組合構建我的請求......

DELETE http://example.com/index.php/tags/12

(擺脫url的/ tag/id /段...這意味着您正在通過id從'tags'集合中刪除'tag'行,不需要附加/ tag/id )

function tag_delete ($id) { 

    $result = $this->tag_model->delete($id); 

    if (! $result) { 
      $this->response(array('status' => 'failed'), 400); 
    } 

    $this->response(array('status' => 'success'), 200); 
} 

的收集:

Backbone.Collection.extend({ 
    url : '/tags' 
}); 

tagCollection.at(5).destroy(); 

然後加入這樣的事情你的路由:

$route['tags/(:num)'] = 'tags/tag/$1'; 

將建立必要的restserver控制器結構......它只是多如果你正在做很多骨幹工作,那麼這種方式更易於管理。

+0

我喜歡tgriesser!謝謝你的提示。我是新來的工作與寧靜的codeigniter,這對我來說是有道理的。今天午餐時間我正在爲此做一個解決方案,並想出了這個: 我重載了$ this-> delete: 'function delete($ var){ $ uri_array = $ this-> uri-> uri_to_assoc (3); return $ uri_array [$ var]; }' 所以我仍然可以使用$ this-> delete('id')並讓它返回我的預期。也就是說,我們基本上是在做同樣的事情。感謝您花時間看! – Greg

+1

沒問題 - 同樣,與原始問題無關,但如果您開始遇到因絕對沒有理由而隨機過期的問題,並且您的應用程序非常麻煩,請查看此主題以瞭解如何解決問題。 - 如果最終出現同樣的問題,希望它能爲您節省一點時間。 http://codeigniter.com/forums/viewthread/138823/P15/#913493 – tgriesser

+0

所以,奇怪的是,今天剛剛發生在我身上,我想,「我知道有人在某個時候提到過這個」,並發現你的那裏評論。感謝提及它! – Greg

0

根據tgriesser的建議,最好的方法是使用集合上的url屬性。我已經使用之前以下和它的作品般的魅力(使用硅石框架+的數據訪問巴黎庫中實現以下控制器):

// DELETE /{resource}/{id} Destroy 
$app->delete('/api/todos/{id}', function ($id) use ($app) { 
    $todo = $app['paris']->getModel('Todo')->find_one($id); 
    $todo->delete(); 

    return new Response('Todo deleted', 200); 
}); 

在你的骨幹集,添加以下內容:

window.TodoList = Backbone.Collection.extend({ 
    model: Todo, 

    url: "api/todos", 

    ... 
}); 

最近,我寫了一篇關於如何使用Backbone.js和PHP http://cambridgesoftware.co.uk/blog/item/59-backbonejs-%20-php-with-silex-microframework-%20-mysql做GET/POST/PUT/DELETE的教程,可能會有所幫助。