API-интерфейс Rails не наследует метод от родительского класса - PullRequest
1 голос
/ 14 января 2020

Создание API для моего первого проекта Rails. У меня есть базовый класс ApiController для всех API:

module Api
  class ApiController < ::ApplicationController
    respond_to :json
    skip_before_action :verify_authenticity_token

    def index
      @collection = resource_class.all
      render json: @collection.as_json(as_json_collection)
    end

    private

    def resource_class
      raise NotImplementedError
    end

    def as_json_collection
      {}
    end

  end
end

И у меня есть дочерний класс UsersController:

module Api
  class UsersController < ApiController

    private

    def resource_class
      User
    end

    def resource_params
      params.require(:user).permit(:name, :email)
    end
  end
end

Мои маршруты:

namespace :api do
    resources :users
end

Тогда я ' я иду к my_app / api / users У меня ошибка:

Не удалось найти действие 'index' для Api :: UsersController

Но затем я изменил запись UsersController это собственный индексный класс, все работает нормально, и у меня все пользователи в формате JSON. Я попытался прокомментировать все частные оценки в обоих классах, но это не помогает. Я не хочу писать API для каждой сущности в моем проекте, и я хотел бы избежать этой проблемы в будущем.

Ответы [ 3 ]

1 голос
/ 15 января 2020

Я заставил его работать с этим:

module Api
  class ApiController < ::ApplicationController

    def index
      respond_to do |format|
        format.json { render json: '"abc"' }
      end
    end
  end
end

module Api
  class UsersController < ApiController
  end
end

URL был http://localhost:3000/api/users.json

Так что для вас я предлагаю:

module Api
  class ApiController < ::ApplicationController

    def index
      respond_to do |format|
        format.json do
          @collection = resource_class.all
          render json: @collection.as_json(as_json_collection)
        end
      end
    end
  end
end

module Api
  class UsersController < ApiController
    def resource_class
      User
    end

    def resource_params
      params.require(:user).permit(:name, :email)
    end
  end
end
0 голосов
/ 14 января 2020

Вы должны прочитать это, мой друг: маршруты рельсов

Когда вы сделаете это:

namespace :api do
    resources :users
end

rails автоматически создает маршруты CRUD, что означает, что my_app/api/users переведет в: .../users#index.

Сделайте это, чтобы увидеть ваши маршруты, созданные рельсами:

rails routes и для конкретного c слова (например, пользователя): rails routes | grep user

Видеть - значит верить;)

0 голосов
/ 14 января 2020

Это должно быть так:

  class Api::ApiController < ApplicationController

и не забудьте удалить лишний end конец файла!

#sample
- api(folder)
-- api_controller.rb   (Api::ApiController < ApplicationController)
-- users_controller.rb (Api::UsersController < Api::ApiController)

application_controller.rb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...