Rails + Angularjs: Как связаться (удалить запись из базы данных) с бэкэндом?

0

Я придерживался этого в течение всего дня.

На http://localhost:3001/posts/, я перечисляю все сообщения, которые у меня есть в базе данных. Я пытаюсь удалить задачу с помощью Angularjs - каждая загруженная запись из базы данных имеет ссылку для ее удаления:

= link_to 'Delete', '', 'ng-click' => "deletePost('#{post.id}')", :id => "post_#{post.id}"

Затем у меня есть файл /assets/javascript/angular/controller/posts.js который выглядит так:

var app = angular.module('AngTestApp', ['ngResource']);

app.factory('Post', function($resource) {
    return $resource("/posts/:id", { id: '@id' }, {
        index:   { method: 'GET', isArray: true, responseType: 'json' },
      show:    { method: 'GET', responseType: 'json' },
      update:  { method: 'PUT', responseType: 'json' }
    });
})

app.controller("PostsCtrl", function($scope, Post) {
  $scope.posts = Post.index();
    $scope.deletePost = function(index) {
        console.log("index: "+index);
        post = $scope.posts[index];
      Post.delete(post);
        $scope.posts.splice(index, 1);
        console.log('aa');
    }
})

Когда я нажимаю ссылку delete, я получаю эту ошибку в консоли JS:

DELETE http://localhost:3001/posts 404 (Not Found)

и в терминале:

Started DELETE "/posts" for 127.0.0.1 at 2015-10-15 16:23:08 -0700

ActionController::RoutingError (No route matches [DELETE] "/posts"):

Маршруты выглядят так:

resources :posts do
  resources :comments
end

JS-код очень хаотичен, я попытался изменить учебник, который я нашел в Интернете, но он не работает.

Что не так в этой попытке?

Заранее спасибо.

1 ответ

1

Вам необходимо передать идентификатор записи, которую вы пытаетесь удалить, в качестве параметра в вызове Rails. Rails сообщает вам, что не может найти маршрут, потому что у вас нет идентификатора.

Поскольку вы не определяете действие DELETE на своей фабрике, вероятно, почему идентификатор не проходит. Вы также можете попробовать явно передать id в качестве параметра, как показано ниже: $ resource принимает атрибут params, поэтому вы можете изменить свой завод так:

app.factory('Post', function($resource) {
    return $resource("/posts/:id", { id: '@id' }, {
      index:   { method: 'GET', isArray: true, responseType: 'json' },
      show:    { method: 'GET', responseType: 'json' },
      update:  { method: 'PUT', responseType: 'json' },
      delete:  { method: 'DELETE', params: '@id', responseType: 'json' }
    });
})

Документы $ resource довольно полезны: https://docs.angularjs.org/api/ngResource/service/ $ resource

  • 0
    Привет, Брэд, спасибо за ответ. Я пробовал это, но в результате TypeError: Cannot read property 'delete' of undefined в консоли JS. Нужно ли включать в проект еще несколько библиотек?
  • 0
    хм, кажется, что где-то есть тип, и фабрика возвращает неопределенный. Также вы можете посмотреть на это: stackoverflow.com/questions/16167463/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню