【问题标题】:Rails and AngularJS ngResource: Creating a custom REST operation to access models attached to a has_many associationRails 和 AngularJS ngResource:创建自定义 REST 操作以访问附加到 has_many 关联的模型
【发布时间】:2013-06-09 14:13:33
【问题描述】:

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

在 Rails 方面,我有两个模型:Genre 和 Book。

  • 每种类型 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

这是我的 Angular ngResource 流派(用咖啡脚本编写):

app = angular.module("ATWP")

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

    books:
      method: "GET"

我尝试将isArray: true 附加到REST 操作无济于事。我只是取回了 Genre 资源本身,而不是属于该 Genre 的一系列书籍。

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 angularjs


    【解决方案1】:

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

    【讨论】:

    • 我重写了我的 Angular 资源,可以在 Plunker 中找到。这是更新资源的正确方法吗?我只是尝试这样做,每当我尝试访问 Genre.index() 时都会收到 TypeError。
    • 我的错,我应该告诉你为新路线创建新工厂。 app.factory "GenreBooks" $resource "/genrebooks/:id", id: "@id" , books: method: "GET" isArray: true 完成后从控制器调用新工厂。
    • 所以它工作。感谢您的帮助!不过考虑一下,在 Rails 路由文件中将 Book 资源嵌套在 Genre 下是否更有意义?我唯一的问题是,有时我想获得所有书籍,无论流派如何。
    • 这一切都取决于您构建的应用程序,就您个人而言,我会将其分开,因为您需要没有流派的书籍。以后会更容易维护和阅读。
    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    相关资源
    最近更新 更多