【问题标题】:Angular JS ngResource with nested resources具有嵌套资源的 Angular JS ngResource
【发布时间】:2013-02-25 00:34:54
【问题描述】:

我正在尝试 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'

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

resources :users do
  resources :user_missions
end

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

任何帮助将不胜感激。

更新

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

【问题讨论】:

    标签: ruby-on-rails-3 json angularjs nested-forms nested-attributes


    【解决方案1】:

    通读我的answer 到您之前的问题,您应该在调用中作为参数传递的对象中包含两个参数的值,即。 e.:

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

    【讨论】:

    • 所以我还是有点困惑。如何从父对象 (User) 和子对象 (UserMission) 中找到 id,并使用 Angularjs 将它们传递给 Rails 应用程序中的资源并完成嵌套关系查询?
    • 通过声明您的服务默认参数{user_id: "@user_id", id: "@id"},您的意思是,当调用不带参数的服务时,它们会从您在调用中传递的对象中获取值。在您的情况下,您正在调用不带参数的服务,如UserMission.query(),但您没有传递任何值,因此使用空值调用服务,因此服务器得到/users/user_missions,这会给出错误。正如我在回答中指出的那样,您应该在调用中包含参数值。
    【解决方案2】:

    我也在寻找一种使用 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 函数接收一个字符串值,因此您必须首先将数据解析为您所期望的。另一个需要注意的是,您返回的是您想要的实际最终数据值,而不是字符串。即使您收到一个字符串值,您也应该返回所需的结束数据值。

    【讨论】:

    • 感谢您对 transformResponse 的解释!正是我想要的。
    • 如果您想在控制器中获取num_resultstotal_pages 等,您可以在资源中使用query: { method: 'GET', isArray: false },然后使用MyModel.query({/*params*/}, function(data) { $scope.numResults = data.num_results; $scope.things = data.objects; });
    【解决方案3】:

    “数据对象”指的是您的 instance 对象($scope.user_missions 是这些对象的数组——或者更确切地说,如果您确实成功地检索到了它),您可以想到 @987654322 @ 作为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-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2011-08-23
      • 2014-08-02
      • 2012-04-21
      • 1970-01-01
      相关资源
      最近更新 更多