具有嵌套资源的Angular JS ngResource

GTD*_*Dev 15 json nested-forms nested-attributes ruby-on-rails-3 angularjs

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

我写了以下几行:

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

我收到以下错误:

  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'
Run Code Online (Sandbox Code Playgroud)

我的rails路由组织如下:

resources :users do
  resources :user_missions
end
Run Code Online (Sandbox Code Playgroud)

我认为这归结于我不理解"@id".它说它来自angularjs网站的"数据对象" ,我不确定这意味着什么.

任何帮助将不胜感激.

更新

另一个问题.我没有使用嵌套资源(示例用户has_many :missions, through: :user_missions)找到带有angularjs的rails的任何示例$resource.是否有一个$resource使用ajax 操纵嵌套资源(with )的angularjs的好例子?

rem*_*gio 16

通过阅读我的回答对你前面的问题,您应该包括两个在传递中调用,即参数对象的参数值:

$scope.user_missions = UserMission.query({user_id: some_value, id: some_other_value});
Run Code Online (Sandbox Code Playgroud)

  • 通过声明服务默认参数`{user_id:"@ user_id",id:"@ id"}`你说,当调用没有参数的服务时,它们从你在调用中传递的对象中获取值.在你的情况下,你正在调用没有参数的服务,如`UserMission.query()`,但你没有传递任何值,所以服务是用空值调用的,因此服务器得到`/ users/user_missions `这给出了错误.您应该在调用中包含参数值,正如我在答案中指出的那样. (2认同)

bpe*_*man 10

我也在寻找一种使用ngResource处理嵌套资源的方法.我不熟悉rails的工作原理或数据的外观,但这就是我的意思:

{"num_results": 5, "objects": [....], "page": 1, "total_pages": 1}
Run Code Online (Sandbox Code Playgroud)

我需要进入并抓取嵌套对象数组以进行查询操作.使用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;
    }}});
Run Code Online (Sandbox Code Playgroud)

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

需要注意的一点是,transformResponse函数接收一个字符串值,因此您必须首先将数据解析为您所期望的内容.另一个需要注意的是,您返回所需的实际最终数据值,而不是字符串.即使您收到字符串值,也应返回所需的最终数据值.