15

私は角度JSを試しています。私は自分のレールアプリケーションで定義されたネストされたリソースからデータを取得したいと思います。ネストされたリソースを持つAngular JS 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からの "データオブジェクト"に由来し、その意味が正確にはわかりません。

ご協力いただきありがとうございます。

更新

もう一つの問題。私は$resourceとネストされたリソース(例User has_many :missions, through: :user_missions)を使用するangularjsを持つレールの例を見いだせませんでした。 ajaxで入れ子にされたリソース($resource)を操作するangularjsの良い例はありますか?

答えて

16

前の質問に私のanswerを読んで、呼び出しのパラメータとして渡すオブジェクトに両方のパラメータの値を含める必要があります。 e:

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

私はまだ少し混乱しています。親オブジェクト(User)と子オブジェクト(UserMission)からIDを見つけ、それらをAngularjsを持つrailsアプリケーションのリソースに渡してネストされたリレーションクエリを完成させるにはどうすればよいですか? – GTDev

+2

サービスのデフォルトパラメータ '{user_id:" @user_id "、id:" @id "}を宣言することによって、パラメータを持たないサービスを呼び出すときに、コールで渡したオブジェクトから値が取得されます。あなたの場合、 'UserMission.query()'のようにパラメータを持たないサービスを呼び出していますが、値を渡していないので、サービスはnull値で呼び出されます。したがって、サーバは '/ users/user_missions 'これはエラーを示します。私の答えに示されているように、コールにパラメータ値を含める必要があります。 – remigio

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関数が文字列値を受け取ることです。そのため、まずデータを解析して期待しているものにする必要があります。もう1つの注意点は、文字列ではなく、実際の最終的なデータ値を返すことです。文字列値を受け取ったとしても、必要な終了データ値を返す必要があります。

+0

transformResponseのこの説明をありがとう!ちょうど私が探していたもの。 – Casey

+1

+1「transformResponse」の良い例です。 –

+1

あなたのコントローラに 'num_results'、' total_pages'などを取得したいなら、あなたのリソース内で 'query:{method: 'GET'、isArray:false}'を使い、 'MyModel.query({/ * $ scope.things = data.objects;}); '' $ { –

3

"データオブジェクト"はinstanceオブジェクトを参照しています($ scope.user_missionsはオブジェクトの配列です。実際には正常に取得できた場合)。UserMissionは存在すると考えることができますclass

classオブジェクト(UserMission)でクエリメソッドを呼び出す場合は、どのユーザーのUserMissionを取得するかを知るには、少なくとも1つのパラメータが必要です。

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

上記( "はONEをGET")

特定UserMissionを入手するには、 "はALL GET"、あなたは両方のID

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

を供給する必要があります実行することになり意味がありますか?

関連する問題