проблемы с запросом DELETE backbone.js и восстановителем кода (phils) - PullRequest
1 голос
/ 03 ноября 2011

Я уверен, что это то, что я делаю неправильно, но я не могу понять это.Я использую backbone.js, чтобы общаться с моим сервером отдыха (restseriter codeigniter Филипа Стерджона).Я использую обычную модель model.destroy () для одной из моих коллекций магистральных моделей.

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

Это создает правильный вызов для URL, например:

УДАЛИТЬ http://mydomain.com/index.php/tags/tag/id/12

Когда я попадаю в свою функцию php "tag_delete" и выполняю:

$this->delete('id');

Это всегда ничего не возвращает.Я предполагаю, что это как-то связано с тем, как backbone.js отправляет свои запросы, но у меня ничего не выходит.Подробности ниже.

Backbone отправляет запрос "DELETE".

Соответствующий код из моего метода 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);
}

Есть идеи?Любые эксперты backbone.js сталкиваются с этим при использовании codeigniter и restserver Филипа Стерджона?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Это должен быть дешевый быстрый способ исправить ваш запрос на удаление ...

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

(избавиться от / tag / id / сегмента URL-адреса ... подразумевается, что вы удаляете строку 'tag' из коллекции 'tags' по 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 ... это намного более управляемо, если вы выполняете много работы с Backbone.

0 голосов
/ 14 января 2012

Согласно предложению tgriesser, лучший способ сделать это - использовать свойство url в коллекции.Ранее я использовал следующее, и оно работает как charm (следующий контроллер реализован с использованием framework Silex + библиотека paris для доступа к данным):

// 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",

    ...
});

Недавно я написал учебник о том, как выполнять GET / POST / PUT / DELETE с Backbone.js и PHP http://cambridgesoftware.co.uk/blog/item/59-backbonejs-%20-php-with-silex-microframework-%20-mysql,, может быть полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...