ng-ресурс в Rails. Учебное пособие по AngularJS Rails

#ruby-on-rails #angularjs #coffeescript #ngresource

#ruby-on-rails #angularjs #coffeescript #ngresource

Вопрос:

Я пытаюсь использовать ng-resource для отображения индекса названий книг. Это глава 11 AngulaRails, которая до сих пор была действительно сложной.

Я знаю, что моя проблема связана с попыткой использовать ресурс в моем контроллере coffeescript, потому что, когда я просто использую запрос $ http «get» с определенным URL, все работает нормально. Вот все части моего кода для этого:

1.javscripts/application.js

 // This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file.
//
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require jquery
//= require jquery_ujs
//= require bootstrap.min
//= require angular.min
//= require angular-resource

//= require angular-application
  

2 Сериализатора:

 class BookSerializer < ActiveModel::Serializer
  attributes :id, :title, :author

end
  

3 это работает нормально:

 AngulaRails.config ["$httpProvider", ($httpProvider) ->
  $httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content')
  $httpProvider.defaults.headers.common.Accept = "application/json"
]
  

4 javascripts/angular-application.js

 //= require_self
//= require_tree ./angular

AngulaRails = angular.module("AngulaRails", ["ngResource"]);
  

5 контроллер индекса для индекса, на который я пытаюсь посмотреть:

   # GET /books
  def index
    @books = Book.all

    respond_to do |format|
      format.html {   }
      format.json { render json: @books, root: false, each_serializer: BookSerializer }
    end
  end
  

6 Фабрика для ресурса, который я пытаюсь использовать. В этом случае я вызываю запрос для индекса:

 AngulaRails.factory "Book", ($resource) ->
  $resource("/books/:id")
  {
  'get':    {method: 'GET'},
  'save':   {method: 'POST'},
  'query':  {method: 'GET', isArray: true},
  'remove': {method: 'DELETE'},
  'delete': {method: 'DELETE'}
  }
  

7 и последнее, но не менее важное: контроллер coffescript для этого приложения:

 AngulaRails.controller "BooksController", ($scope,  Book) ->
  $scope.getBooks = () ->
    $scope.books = Book.query()
  

Когда я пытаюсь запустить это, консоль.журнал выдаст мне сообщение об ошибке:

Ошибка: Книга.запрос не является функцией

Ответ №1:

действительно, проблема с вашим объявлением factory. Вам не нужно включать выделение действий для типов запросов «GET», «POST» и т. Д., Поскольку это настройка по умолчанию.

Единственная проблема, которая может возникнуть, связана с действием обновления, которое отображается в POST запросе по умолчанию. Однако PUT запрос может быть более разумным с целью обновления записи данных. Поэтому я включил {update: {method: "PUT"}} , который перезаписывает значение по умолчанию.

Кредит: книга AngulaRails. Это работает:

   AngulaRails.factory "Book", ($resource) ->
    $resource("/books/:id", {id: "@id"}, {update: {method: "PUT"}})
  

Однако, если вы хотите включить его явно, следите за правильной установкой скобок.

 AngulaRails.factory "Book", ($resource) ->
  $resource("/books/:id", {id: "@id"},
  {
   get:    {method: 'GET'},
   save:   {method: 'POST'},
   query:  {method: 'GET', isArray: true},
   remove: {method: 'DELETE'},
   delete: {method: 'DELETE'}
   update: {method: "PUT"}
  })
  

Комментарии:

1. спасибо за ответ!! Основная проблема заключалась в том, что у меня была еще одна фабрика, и это было после этой в моем конвейере ресурсов, поэтому rails использовал ЕЕ и пропустил эту. **** качаю головой****

Ответ №2:

Существует проблема с объявлением фабрики. Он возвращает этот объект:

   {
  'get':    {method: 'GET'},
  'save':   {method: 'POST'},
  'query':  {method: 'GET', isArray: true},
  'remove': {method: 'DELETE'},
  'delete': {method: 'DELETE'}
  }
  

query свойство которого является объектом, а не функцией… отсюда и ошибка. Вероятно, это то, что вы имели в виду…

 ($resource) ->
  $resource("/books/:id", {}, 
  {
  'get':    {method: 'GET'},
  'save':   {method: 'POST'},
  'query':  {method: 'GET', isArray: true},
  'remove': {method: 'DELETE'},
  'delete': {method: 'DELETE'}
  })
  

Комментарии:

1. попробовал, но все равно получаю ту же «Книгу. запрос не является функцией» ошибка

Ответ №3:

Основная проблема заключалась в том, что у меня была еще одна фабрика, и это было после этой в моем конвейере ресурсов, поэтому rails использовал ЕЕ и пропустил эту. качаю головой

но да, этот хэш не был необходим:

 {
  'get':    {method: 'GET'},
  'save':   {method: 'POST'},
  'query':  {method: 'GET', isArray: true},
  'remove': {method: 'DELETE'},
  'delete': {method: 'DELETE'}
  }