Rails JSON Rest API: получение дочернего класса от родителя через вызов API

У меня есть два контроллера API в моем приложении Rails для настройки RESTful:

  • StoresController (имеет много продуктов)
  • ProductsController (имеет один магазин)

Как мне написать API так, чтобы

http://localhost:3000/api/v1/stores/37/products

возвращает только товары для этого магазина (в данном случае магазин № 37)? Я думаю, что мне не хватает метода маршрута и контроллера, чтобы это произошло.

Маршруты

    namespace :api, defaults: {format: 'json'} do
      namespace :v1 do
        resources :stores
        resources :licenses
      end
    end

Контроллеры API

APIКонтроллер:

    module Api
      module V1
        class ApiController < ApplicationController
          respond_to :json
          before_filter :restrict_access

          private

          def restrict_access
            api_app = ApiApp.find_by_access_token(params[:access_token])
            head :unauthorized unless api_app
          end
        end
      end
    end

Контроллер магазинов:

  module Api
    module V1
      class StoresController < ApiController

        def index
          respond_with Store.all
        end

        def show
          respond_with Store.find_by_id(params[:id])
        end
      end
    end
  end

ПродуктыКонтроллер:

    module Api
      module V1
        class ProductsController < ApiController
          def index
            respond_with Product.all
          end

          def show
            respond_with Product.find_by_id(params[:id])
          end
        end
      end
    end

Спасибо за любое понимание.


person Brit200313    schedule 02.06.2015    source источник


Ответы (2)


Вам нужны вложенные ресурсы в ваших маршрутах:

resources :stores do
  resources :products
end

Итак, у вас есть эти маршруты:

GET        /stores/:id
GET/POST   /stores/:store_id/products
PUT/DELETE /stores/:store_id/products/:id

Вам также могут понадобиться неглубокие маршруты, чтобы избежать глубоко вложенных ресурсов:

resources :stores, shallow:true do
  resources :products
end

Итак, у вас есть эти маршруты:

GET        /stores/:id
GET/POST   /stores/:store_id/products
PUT/DELETE /products/:id

Когда у вас есть маршруты, вы можете просто сначала загрузить родительский магазин и использовать ассоциацию продуктов:

@store = Store.find(params[:store_id])
@products = store.products
person Julien Portalier    schedule 02.06.2015

Вы можете охватить продукты по идентификатору магазина.

class ProductsController < ApiController
  def index
    store = Store.find(params[:store_id])
    respond_with store.products
  end
end

Если вы посмотрите на свой маршрут:

http://localhost:3000/api/v1/stores/37/products

Вы обнаружите, что 37 является частью вашего маршрута, указанного в ваших параметрах, возможно, в :store_id. Проверьте rake routes, чтобы убедиться.

person bratsche    schedule 02.06.2015