15

我正在尝试 Angular JS,我想从我的 rails 应用程序中定义的嵌套资源中获取数据。

我写了以下几行:

UserMission = $resource("/users/:user_id/user_missions/:id", {user_id: "@user_id", id: "@id"}, {update: {method: "PUT"}})
$scope.user_missions = UserMission.query()

我收到以下错误:

  Processing by UsersController#show as JSON
  Parameters: {"id"=>"user_missions"}
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", "user_missions"]]
Completed 404 Not Found in 10ms

ActiveRecord::RecordNotFound (Couldn't find User with id=user_missions):
  app/controllers/users_controller.rb:100:in `current_resource'
  app/controllers/application_controller.rb:34:in `authorize'

我的铁路路线是这样组织的:

resources :users do
  resources :user_missions
end

我认为这归结为我不理解“@id”。它说它来自angularjs 站点的“数据对象” ,我不确定这意味着什么。

任何帮助将不胜感激。

更新

另一个问题。我还没有找到任何使用 angularjs 使用嵌套资源(示例 User has_many :missions, through: :user_missions)和$resource. 有没有一个 angularjs$resource使用 ajax 操作嵌套资源(with )的好例子?

4

3 回答 3

16

通读我对上一个问题的回答,您应该在调用中作为参数传递的对象中包含两个参数的值,即:

$scope.user_missions = UserMission.query({user_id: some_value, id: some_other_value});
于 2013-02-25T07:15:46.003 回答
10

我也在寻找一种使用 ngResource 处理嵌套资源的方法。我不熟悉 rails 的工作原理或您的数据是什么样的,但这就是我所拥有的:

{"num_results": 5, "objects": [....], "page": 1, "total_pages": 1}

我需要进入并获取嵌套对象数组以进行查询操作。使用 1.0 版本的 angular 这是不可能的。但是,使用 1.1 版本(我用 1.1.3 测试过)可以做到这一点。

在我的控制器中,我只是像这样设置资源:

$scope.MyModel = $resource("/api/mymodel/:id",
    {},
    {'query': {method: 'GET', isArray: true, "transformResponse": function (data) {
        return JSON.parse(data).objects;
    }}});

这里的关键是transformResponse作为操作配置的一部分传递的函数。在 1.1 中,操作配置中的任何额外配置项都会传递到$http请求的配置中。该$http服务允许一个transformResponse可以操作请求返回的数据的函数。使用此函数,我可以进入嵌套结构并返回操作所需的数组。

这里要注意的一个警告是 transformResponse 函数接收一个字符串值,因此您必须首先将数据解析为您所期望的。另一个需要注意的是,您返回的是您想要的实际最终数据值,而不是字符串。即使您收到一个字符串值,您也应该返回所需的结束数据值。

于 2013-03-03T05:32:18.513 回答
3

“数据对象”指的是您的instance对象($scope.user_missions 是这些对象的数组——或者更确切地说,如果您确实成功地检索到它),您可以将其UserMission视为class.

如果您在class对象 ( UserMission) 上调用查询方法,在您的情况下,它至少需要一个参数才能知道UserMission要检索哪个用户。

UserMission.query({user_id: <USER_ID>});

以上将执行“ GET ALL

要获得特定的UserMission(“ GET ONE ”),您必须提供两个 ID

UserMission.query({user_id: <USER_ID>, id: <MISSION_ID>});

说得通?

于 2013-03-03T15:23:43.397 回答