2013-06-09 1 views
0

Я создаю веб-приложение, которое использует 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, но не массив книг, принадлежащих жанру.

Итак, что мне не хватает? Это плохая идея, в первую очередь, сделать что-то вроде того, что я пытаюсь сделать в приведенных выше примерах? Любой вход оценивается.

ответ

1

Если вы создали новые «контрольные» действия контроллера, ресурсы маршрута не подберут его. Вы должны определить пользовательский маршрут, например match '/genrebooks/:id', to: 'genres#books', via: :get. После этого вы должны обновить завод, чтобы он соответствовал новому маршруту.

+0

Я переписал свой Угловой ресурс, который можно найти здесь, в [Plunker] (http://plnkr.co/edit/h1Yx9av6esJof8JBjJLh?p=catalogue). Это правильный способ обновления ресурса? Я просто пытался сделать это так, и я получаю TypeError всякий раз, когда я пытаюсь получить доступ к Genre.index(). –

+1

Неплохо, я должен был предложить вам создать новый завод для нового маршрута. app.factory "GenreBooks" $ ресурсов "/ genrebooks /: идентификатор", ID: "@Id" , книги: метод: "GET" IsArray: истинный Когда это будет сделано, вызвать новый завод из контроллер. – species

+0

Так оно работает. Спасибо за помощь! Думая об этом, было бы разумнее вложить ресурс книги в жанре в файле маршрутов Rails? Единственная проблема, я имею в том, что есть моменты, когда я хотел бы получить все Книги, независимо от жанров. –

Смежные вопросы