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>}); 

說得通?