Angular JS ngResource с вложенными ресурсами

Я пытаюсь использовать 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'

Мои маршруты рельсов организованы так:

resources :users do
  resources :user_missions
end

Я думаю, это сводится к тому, что я не понимаю "@id". В нем говорится, что он происходит от "объекта данных" с сайта angularjs, и я не совсем уверен, что это значит.

Любая помощь была бы оценена благодарностью.

Обновление

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

Ответы

Ответ 1

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

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

Ответ 2

Я также искал способ обработки вложенных ресурсов с помощью ngResource. Я не знаком с тем, как работают рельсы или какие ваши данные выглядят, но это то, что у меня было:

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

Мне нужно было найти и захватить массив вложенных объектов для действия запроса. Используя версию версии angular 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 получает строковое значение, поэтому сначала вы должны проанализировать данные в ожидаемом. Другой оговоркой является то, что вы возвращаете фактическое конечное значение данных, которое вы хотите, а не строку. Даже если вы получите строковое значение, вы должны вернуть требуемое значение конечных данных.

Ответ 3

"Объект данных" относится к вашим объектам instance ($ scope.user_missions - это массив этих объектов - или, скорее, если вы действительно смогли его восстановить), и вы можете думать о UserMission как class.

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

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

Вышеописанное выполнило бы " ПОЛУЧИТЬ ВСЕ"

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

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

Имеет смысл?