15

我试着角JS,我想从我的rails应用程序中定义的嵌套资源中获取数据。AngularJS ngResource与嵌套资源

我写了下面几行:

UserMission = $resource("https://stackoverflow.com/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 site的“数据对象”,我不确定这意味着什么。

任何帮助,将不胜感激谢谢。

更新

另一个问题。我还没有找到任何使用嵌套资源(例如用户has_many :missions, through: :user_missions)以及使用$resource的angularjs的rails示例。有没有angularjs操作嵌套资源(使用$resource)与Ajax的好例子?

回答

16

通过我的answer通读您的上一个问题,您应该包含这两个参数的值,这些参数在您作为参数传入的对象中传递,即i。 e .:

$scope.user_missions = UserMission.query({user_id: some_value, id: some_other_value}); 
+1

所以我还是有点困惑。我如何从父对象(User)和子对象(UserMission)中找到id,并将它们传递给Rails应用中的Angularjs资源并完成嵌套关系查询? – GTDev 2013-02-25 21:20:28

+2

通过声明你的服务默认参数'{user_id:“@user_id”,id:“@id”}你说的是,当调用不带参数的服务时,它们会从你在调用中传递的对象中获取值。在你的情况下,你调用没有参数的服务,就像在'UserMission.query()'中一样,但是你没有传递任何值,所以服务被调用了空值,因此服务器得到了'/ users/user_missions '这给出了错误。您应该在呼叫中包含参数值,正如我在答案中所指出的那样。 – remigio 2013-02-26 07:58:53

10

我还在寻找一种方法来处理ngResource的嵌套资源。我不熟悉如何轨工作或你的数据看起来像但这是我有什么:

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

我需要达到并抓住嵌套对象数组的查询动作。使用角度的1.0版本是不可能的。但是,对于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函数接收到一个字符串值,因此您必须首先将数据解析为您所期望的。另一个警告是你返回你想要的实际最终数据值,而不是一个字符串。即使您收到一个字符串值,您应该返回所需的最终数据值。

+0

感谢transformResponse的解释!正是我在找的东西。 – Casey 2013-07-11 16:59:04

+1

+1 transformResponse的一个很好的例子。 – 2013-08-28 08:43:01

+1

如果你想在控制器中获得'num_results','total_pages'等,你可以在你的资源中使用'query:{method:'GET',isArray:false}',然后使用'MyModel.query({/ * params * /},函数(data){$ scope.numResults = data.num_results; $ scope.things = data.objects;});' – 2013-08-28 08:57:24

3

“数据对象”指的是你instance对象($ scope.user_missions是这些对象的数组 - 或者是相反,如果你确实设法成功地检索它),你能想到的UserMissionclass

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

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

以上将执行 “得到所有

为了获得特定UserMission( “得到一个”),你就必须同时提供标识

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

说得通?