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

Adrià Carro picture Adrià Carro · Oct 14, 2016 · Viewed 10.5k times · Source

I have Rails 5 API project for controlling user tasks and I have the following error but not always for the same controller and route.

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

I describe you a little bit my project to explain in more detail the error.

App structure

enter image description here

Routes

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 Controller

module Api
  class ApiController < ApplicationController

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

  end
end

Team Controller

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

Tasks Controller

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

Login Controller

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

Sessions Controller

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

When I execute login route and after tasks route, I get the error in last route and all the routes in team module. If I change the project and save it (only one blank space) and then I execute tasks route and after login route, I get the error in last route and all the routes in login module.

It doesn't have any sense...

Rails server in this errors enter image description here enter image description here

Answer

Andrey Deineko picture Andrey Deineko · Oct 14, 2016

You should be using the right constant while inheriting - ::Api::ApiController:

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

because otherwise it is searching for Api::V1::ApiController, but should search for Api::ApiController