carro carro - 1 month ago 47
Ruby Question

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

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

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