0

我正在创建一个利用 Rails 3 提供 JSON 的 Web 应用程序。我使用 AngularJS'ngResource与 RESTful 服务器端数据进行交互。

在导轨方面,我有两个模型:流派和书籍。

  • 每个流派has_many书籍
  • 每本书belongs_to一个流派
  • routes.rb中,我的资源被列为resources :genres, :books。它们不是嵌套的。

我相信你知道,这让我可以做一些事情,比如打电话Genre.where(name: "sci-fi").first.books返回一个数组。

我想从 Rails 控制器和 AngularngResource工厂做这样的事情。它对我来说正常工作的标准REST......

但是,我正在尝试定义一个自定义REST操作,我可以在其中调用类似这样的操作:Genre.books({ id: 1 })并让它返回一个属于 id 为 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的流派 Angular(用咖啡脚本编写):

app = angular.module("ATWP")

app.factory "Genre", ($resource) ->
  $resource "/genres/:id",
    id: "@id"
  ,
    ....

    books:
      method: "GET"

我试过isArray: true继续REST手术无济于事。我只是取回了类型资源本身,而不是属于该类型的一系列书籍。

那么,我错过了什么?首先做一些像我在上面的例子中试图做的事情是一个坏主意吗?任何输入表示赞赏。

4

1 回答 1

1

如果您创建了新的控制器操作“书籍”,则路由资源将不会拾取它。您应该定义自定义路线,例如match '/genrebooks/:id', to: 'genres#books', via: :get. 之后,您应该更新您的工厂以匹配新路线。

于 2013-06-09T14:45:39.550 回答