15

Я пытаюсь выполнить угловой JS, и я хочу получить данные из вложенного ресурса, определенного в приложении rails.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, и я не совсем уверен, что это значит.

Любая помощь будет принята за благодарность.

Update

Другой вопрос. Я не нашел примеров рельсов с angularjs с использованием вложенных ресурсов (пример User has_many :missions, through: :user_missions) с $resource. Есть ли хороший пример того, как angularjs манипулирует вложенными ресурсами (с $resource) с ajax?

ответ

16

Прочитайте мой answer к предыдущему вопросу, вы должны включить значения для обоих параметров в объект, который вы передаете в качестве параметра в вызове, i. e .:

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

Так что я все еще немного смущен. Как найти идентификатор из родительского объекта (Пользователь) и дочернего объекта (UserMission) и передать их ресурсу в приложении rails с помощью Angularjs и выполнить запрос вложенного отношения? – GTDev

+2

Объявляя свои параметры по умолчанию для службы '{user_id:" @user_id ", id:" @id "}', вы говорите, что при вызове службы без параметров они получают значения от объекта, который вы передаете в вызове. В вашем случае вы вызываете службу без параметров, как в 'UserMission.query()', но вы не передаете никакого значения, поэтому служба вызывается с нулевыми значениями, поэтому сервер получает '/ 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 принимает строковое значение, поэтому сначала вы должны проанализировать данные в ожидаемом. Другой оговоркой является то, что вы возвращаете фактическое конечное значение данных, которое вы хотите, а не строку. Даже если вы получите строковое значение, вы должны вернуть требуемое значение конечных данных.

+0

Спасибо за это объяснение transformResponse! Просто то, что я искал. – Casey

+1

+1 хороший пример 'transformResponse'. –

+1

Если вы хотите получить 'num_results',' total_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 представляет собой массив из этих объектов - или было бы лучше, если вы на самом деле удалось успешно извлечь его), и вы можете думать о UserMission как class.

При вызове метода запроса на class объекта (UserMission), в вашем случае, это требует, по меньшей мере, один параметр, чтобы знать, какой пользователя UserMission (s) для извлечения.

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

выше будет выполнить "GET ALL"

Чтобы получить конкретный UserMission ("GET ONE"), вы должны поставить как идентификаторы

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

Имеет смысл?

Смежные вопросы