Я создаю веб-приложение, которое использует Rails 3 для обслуживания JSON. Я использую AngularJS 'ngResource
для взаимодействия с данными сервера RESTful.Rails и AngularJS ngResource: создание пользовательской операции REST для доступа к моделям, присоединенным к ассоциации has_many
На стороне рельсов у меня есть две модели: жанр и книга.
- Каждый Жанр
has_many
Книги - Каждая книга
belongs_to
жанр - В
routes.rb
, мои ресурсы перечисленыresources :genres, :books
. Они не вложены.
Как я уверен, вы знаете, это позволяет мне делать такие вещи, как вызов Genre.where(name: "sci-fi").first.books
, который возвращает мне массив.
Я хотел бы сделать что-то подобное с контроллера Rails и завода Angular ngResource
. Это работает нормально для меня для стандартных операций REST
...
Однако я пытаюсь определить операцию пользовательских REST
где я мог бы назвать что-то вроде этого: Genre.books({ id: 1 })
и он возвращает массив книг, который принадлежит к Жанр с идентификатором 1.
Вот мой genres_controller.rb
:
class GenresController < ApplicationController
respond_to :json
...
def books
@genre_books = Genre.where(id: params[:id]).first.books
respond_with @genre_books
end
end
Вот мой Угловая ngResource
для жанра (написанном в CoffeeScript):
app = angular.module("ATWP")
app.factory "Genre", ($resource) ->
$resource "/genres/:id",
id: "@id"
,
....
books:
method: "GET"
Я пробовал использовать на isArray: true
операции REST
безрезультатно. Я просто возвращаю ресурс Genre, но не массив книг, принадлежащих жанру.
Итак, что мне не хватает? Это плохая идея, в первую очередь, сделать что-то вроде того, что я пытаюсь сделать в приведенных выше примерах? Любой вход оценивается.
Я переписал свой Угловой ресурс, который можно найти здесь, в [Plunker] (http://plnkr.co/edit/h1Yx9av6esJof8JBjJLh?p=catalogue). Это правильный способ обновления ресурса? Я просто пытался сделать это так, и я получаю TypeError всякий раз, когда я пытаюсь получить доступ к Genre.index(). –
Неплохо, я должен был предложить вам создать новый завод для нового маршрута. app.factory "GenreBooks" $ ресурсов "/ genrebooks /: идентификатор", ID: "@Id" , книги: метод: "GET" IsArray: истинный Когда это будет сделано, вызвать новый завод из контроллер. – species
Так оно работает. Спасибо за помощь! Думая об этом, было бы разумнее вложить ресурс книги в жанре в файле маршрутов Rails? Единственная проблема, я имею в том, что есть моменты, когда я хотел бы получить все Книги, независимо от жанров. –