使用CodeIgniter和AngularJS的API REST(开始工作;删除、保存和更新不工作)

使用CodeIgniter和AngularJS的API REST(开始工作;删除、保存和更新不工作),angularjs,codeigniter,rest,Angularjs,Codeigniter,Rest,我正在用CodeIgniter 3和AngularJS构建一个API REST。视频是西班牙语的,但它是一个伟大的材料: 我无法理解为什么我能够从数据库中检索书籍(这是我们正在制作的一个小型书籍数据库,作为示例)。但我无法删除、编辑或添加它们 目前只关注删除一本书: 如果我点击列表中的第一本书,我会得到: DELETE http://localhost/codeigniter/restangularjs/books/1 400 (Bad Request) 如果我点击列表中的第二本书,我会得到同

我正在用CodeIgniter 3和AngularJS构建一个API REST。视频是西班牙语的,但它是一个伟大的材料:

我无法理解为什么我能够从数据库中检索书籍(这是我们正在制作的一个小型书籍数据库,作为示例)。但我无法删除、编辑或添加它们

目前只关注删除一本书:

如果我点击列表中的第一本书,我会得到:

DELETE http://localhost/codeigniter/restangularjs/books/1 400 (Bad Request)
如果我点击列表中的第二本书,我会得到同样的错误,只是在末尾有数字
2

因此,系统知道调用哪个控制器,甚至向它传递正确的图书id(第一本书的编号为1,第二本书的编号为2)

下面我附上删除一本书所需的所有相关文件。我不知道从哪里开始,希望能得到一些指导

我觉得奇怪的是,在名为Book的工厂(app.js中唯一的工厂)中,我们只定义了
update
(在EditCtrl中使用)。例如,我们不定义
save
(在CreateCtrl中使用)、
delete
get
(在HomeCtrl中都使用)

另一方面,在我看来,当我们处理REST_控制器(Books.php不是一个CI_控制器,而是一个REST_控制器)
update
可以用于所有调用(因此不仅适用于更新,还适用于保存、删除和获取)

我甚至更倾向于这个选项,因为函数Books.get(在HomeCtrl内部)

。。。是唯一正常工作的函数,即使工厂内没有
get
调用

但我不知道。我真的不知道。这是我的第一个API REST

我的目录树(仅在包含相关文件夹和文件的xampp/htdocs上):

CodeIgniter-从Books.php(控制器)中提取

AngularJS-从list.html中提取

<a ng-click="remove(book.id)">Delete</a>
删除

您想让我们调试这么长的代码吗?询问调试帮助在SO是离题的。我明白问题所在,是的。但除此之外,我该如何提出我的问题呢?您认为从代码示例中只提取相关的行是一个好主意吗。这样我的帖子就会短得多。我包含了所有相关的代码,因为我认为这样做比不添加重要内容要好。好的,我删除了与问题没有直接联系的代码。我只留下了与获取和删除书籍有关的代码。
http://localhost/codeigniter/restangularjs/books/1
这是错误的链接。这应该是
http://localhost/codeigniter/restangularjs/books/index/1
同样,您的index\u delete函数应该是这样的
公共函数index\u delete($id)
否则从哪里获得
$id
?你想让我们调试这么长的代码吗?询问调试帮助在SO是离题的。我明白问题所在,是的。但除此之外,我该如何提出我的问题呢?您认为从代码示例中只提取相关的行是一个好主意吗。这样我的帖子就会短得多。我包含了所有相关的代码,因为我认为这样做比不添加重要内容要好。好的,我删除了与问题没有直接联系的代码。我只留下了与获取和删除书籍有关的代码。
http://localhost/codeigniter/restangularjs/books/1
这是错误的链接。这应该是
http://localhost/codeigniter/restangularjs/books/index/1
同样,您的index\u delete函数应该是这样的
公共函数index\u delete($id)
从哪里获得
$id
codeigniter
--restangularjs
----application
------controllers
--------Books.php
------models
--------Books_model.php
angularjs
--ciangularrest
----src
------index.html
------app.js
------components
--------list.html
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

require APPPATH . "/libraries/REST_Controller.php";

class Books extends REST_Controller 
{
    public function __construct() 
    {
        // Ne vem, če je spodnjo vrstico header('Access-Control-Allow-Origin: *'); varno pisati - fora je v tem, da z zvezdico daš dostop vsem. Preveri.
        header('Access-Control-Allow-Origin: *');
        header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
        $method = $_SERVER['REQUEST_METHOD'];
        if($method == "OPTIONS") {
            die();
        }
        parent::__construct();
        $this->load->model('books_model');
    }

    public function index_get()
    {
        $books = $this->books_model->get();

        if( ! is_null($books))
        {
            $this->response(array("response" => $books), 200);
        } else
        {
            $this->response(array("error" => "No books available"), 404);
        }
    }

    // Other functions here but not relevant for my post on StackOverflow

    public function index_delete()
    {
        if( ! $id)
        {
            $this->response(NULL, 400);
        }

        $delete = $this->books_model->delete($id);

        if( ! is_null($delete))
        {
            $this->response(array("response" => "Book deleted"), 200);
        } else
        {
            $this->response(array("error" => "There was an error"), 400);
        }
    }

}
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Books_model extends CI_Model {

    public function __construct()
    {
       parent::__construct();
    }

    public function get($id = NULL)
    {
        if( ! is_null($id))
        {
            $query = $this->db->select("*")->from("books")->where("id", $id)->get();
            if($query->num_rows() === 1)
            {
                return $query->row_array();
            }
            return NULL;
        }

        $query = $this->db->select("*")->from("books")->get();
        if($query->num_rows() > 0)
        {
            return $query->result_array();
        }
        return NULL;
    }

    public function delete($id)
    {
        $this->db->where("id",$id)->delete("books");

        if($this->db->affected_rows() === 1)
        {
            return TRUE;
        }
        return NULL;
    }

}
.controller('HomeCtrl', ['$scope', 'Books', '$route', function ($scope, Books, $route) {

    Books.get(function(data)
    {
        $scope.books = data.response;
    });

    $scope.remove = function(id)
    {
        console.log("inside remove function; " + "deleting the book with id=" + id);

        Books.delete({id:id}).$promise.then(function(data)
        {
            if(data.response)
            {
                $route.reload();
            }
        })

    }

}])

.factory('Books', ["$resource", function($resource){

    return $resource(
        "http://localhost/codeigniter/restangularjs/books/:id", 
        {id:"@_id"}, 
        {update: {method: "PUT", params: {id: "@_id"}}}
    )

}])
<a ng-click="remove(book.id)">Delete</a>