#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'}
}