15

Próbuję out kątowego JS i chcę uzyskać dane z zagnieżdżonego zasobu zdefiniowanego w mojej aplikacji rails.Angular JS ngResource z zagnieżdżonymi zasobami

napisałem następujące linie:

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() 

i pojawia się następujący błąd:

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' 

moich szyn trasy organizowane są w taki sposób:

resources :users do 
    resources :user_missions 
end 

myślę chodzi do mnie nie rozumiejąc "@id". Mówi, że pochodzi z "obiektu danych" z angularjs site i nie jestem do końca pewien, co to oznacza.

Każda pomoc zostanie doceniona dzięki.

Aktualizacja

Inną kwestią. Nie znalazłem żadnych przykładów szyn z angularjs przy użyciu zasobów zagnieżdżonych (przykład użytkownika has_many :missions, through: :user_missions) z $resource. Czy istnieje dobry przykład manipulowania zasobami zagnieżdżonymi angularjs (z $resource) za pomocą ajax?

Odpowiedz

16

Zapoznaj się z moim answer na poprzednie pytanie, należy podać wartości obu parametrów w obiekcie przekazać jako parametr w wywołaniu, i. e .:

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

Więc wciąż jestem trochę zdezorientowany. Jak znaleźć id z obiektu nadrzędnego (użytkownika) i obiektu podrzędnego (UserMission) i przekazać je do zasobu aplikacji railsowej za pomocą Angularjs i wypełnić zapytanie dotyczące relacji zagnieżdżonej? – GTDev

+2

Deklarując domyślne parametry usługi "{user_id:" @user_id ", id:" @id "}" mówisz, że podczas wywoływania usługi bez parametrów, otrzymują wartości z obiektu, który przekazałeś w wywołaniu. W twoim przypadku wywołujesz usługę bez parametrów, jak w 'UserMission.query()', ale nie przekazujesz żadnej wartości, więc usługa jest wywoływana z wartościami pustymi, dlatego serwer dostaje '/ users/user_missions 'który daje błąd. Powinieneś podać wartości parametrów w wywołaniu, jak wskazałem w mojej odpowiedzi. – remigio

10

Szukałem również sposobu na obsłużenie zagnieżdżonych zasobów za pomocą ngResource. Nie jestem pewny, jak szyny dzieła lub co dane wygląda, ale to, co miałem:

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

Musiałem dotrzeć i chwycić zagnieżdżonych tablicę określającą działania zapytań. Korzystanie z wersji 1.0 nie jest możliwe. Jednak w wersji 1.1 (testowałem z 1.1.3) można to zrobić.

W moim kontrolera I właśnie konfiguracji zasobu tak:

$scope.MyModel = $resource("/api/mymodel/:id", 
    {}, 
    {'query': {method: 'GET', isArray: true, "transformResponse": function (data) { 
     return JSON.parse(data).objects; 
    }}}); 

Kluczem tutaj jest funkcja transformResponse przekazywana jako część config działania. W wersji 1.1 wszelkie dodatkowe elementy konfiguracji w konfiguracji akcji są przekazywane do konfiguracji $http dla żądania. Usługa $http umożliwia funkcję transformResponse, która może manipulować danymi zwracanymi przez żądanie. Za pomocą tej funkcji mogę sięgnąć do struktury zagnieżdżonej i zwrócić tablicę potrzebną do wykonania akcji.

Należy zauważyć, że funkcja transformResponse odbiera wartość ciągu, więc najpierw należy przeanalizować dane w oczekiwany sposób. Drugim zastrzeżeniem jest to, że zwracasz rzeczywistą ostateczną wartość danych, którą chcesz, a NIE ciąg znaków. Nawet jeśli otrzymasz wartość ciągu, powinieneś zwrócić wymaganą wartość końcową.

+0

Dzięki za wyjaśnienie transformResponse! Właśnie tego szukałem. – Casey

+1

+1 dobry przykład 'transformResponse'. –

+1

Jeśli chcesz uzyskać 'num_results',' total_pages' itp. W twoim kontrolerze, możesz po prostu użyć 'query: {method: 'GET', isArray: false}' w twoim zasobie, a następnie użyć 'MyModel.query ({/ * params * /}, function (data) {$ scope.numResults = data.num_results; $ scope.things = data.objects;}); ' –

3

„Obiekt danych” odnosi się do instance obiektów ($ scope.user_missions jest tablicą z tych obiektów - albo raczej byłaby, gdyby rzeczywiście udało się z powodzeniem odzyskać) i można myśleć UserMission jako class.

Jeśli wywołać metodę zapytania na obiekcie class (UserMission), w przypadku, wymaga co najmniej jeden parametr, aby wiedzieć, które Użytkownika UserMission (s), aby odzyskać.

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

Powyższy by przeprowadzić "GET ALL"

Aby uzyskać specyficzny UserMission ("dostać jeden"), trzeba by dostarczyć oba identyfikatory

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

Ma sens?

Powiązane problemy