ActionController ::Ошибка маршрутизации: неинициализированный постоянный API ::V1::ApiController

#ruby-on-rails #ruby #ruby-on-rails-5 #rails-routing #rails-api

#ruby-на-рельсах #ruby #ruby-on-rails-5 #рельсы-маршрутизация #rails-api

Вопрос:

У меня есть проект Rails 5 API для управления пользовательскими задачами, и у меня есть следующая ошибка, но не всегда для одного и того же контроллера и маршрута.

 ActionController::RoutingError: uninitialized constant Api::V1::ApiController
 

Я немного опишу вам свой проект, чтобы более подробно объяснить ошибку.

Структура приложения

введите описание изображения здесь

Маршруты

 scope module: 'api' do
  namespace :v1 do

    # => Login routes
    scope module: 'login' do
      match 'login', to: 'sessions#login', as: 'login', via: :post
    end

    # => Team routes
    scope module: 'team' do

      # => no admin routes
      resources :tasks, except: [:index] do
        collection do
          match ':view', to: 'tasks#index', as: 'tasks', via: [:get, :post]
        end
      end
    end

  end
end
 

Контроллер API

 module Api
  class ApiController < ApplicationController

    def respond_with_errors(object)
      render json: {errors: ErrorSerializer.serialize(object)}, status: :unprocessable_entity
    end

  end
end
 

Командный контролер

 module Api::V1
  class Team::TeamController < ApiController
 

Контроллер задач

 module Api::V1
  class Team::TasksController < Team::TeamController
 

Контроллер входа в систему

 module Api::V1
  class Login::LoginController < ApiController
 

Контроллер сеансов

 module Api::V1
  class Login::SessionsController < Login::LoginController
 

Когда я выполняю login route и after tasks route, я получаю сообщение об ошибке в последнем маршруте и всех маршрутах в командном модуле. Если я изменю проект и сохраню его (только одно пустое место), а затем выполню маршрут задач и после маршрута входа в систему я получу сообщение об ошибке в последнем маршруте и всех маршрутах в модуле входа в систему.

В этом нет никакого смысла…

Rails server в этом ошибки
введите описание изображения здесь
введите описание изображения здесь

Комментарии:

1. покажите свой app/controllers/api/v1/api_controller.rb файл

Ответ №1:

Вы должны использовать правильную константу при наследовании — ::Api::ApiController :

 module Api::V1
  class Team::TeamController < ::Api::ApiController
 

потому что в противном случае он ищет Api::V1::ApiController , но должен искать Api::ApiController

Комментарии:

1. Мой контроллер API находится вне папки V1.

2. @carro всегда убедитесь, что вы используете правильную константу 🙂

Ответ №2:

Прямо сейчас у вас есть Api::ApiController .
Ваш app/controllers/api/v1/api_controller.rb отсутствует V1 в пространстве имен

 module Api::V1
  class ApiController < ApplicationController
    ..
  end
end
 

Обновить

Если ваша ApiController папка находится вне V1 папки, то вам следует сделать

 module Api::V1
  class Team::TeamController < ::Api::ApiController
 

Комментарии:

1. Мой контроллер API находится вне папки V1.

2. камон, это просто украдено из моего ответа 🙂

3. нет, это вы его украли. Я изначально написал комментарий к вопросу и собирался ответить на него.

4. не собираюсь обсуждать это дальше. время выпуска ответов говорит само за себя 🙂

5. Я просто не видел его в то время. Я никогда не крал никакого ответа.