ActionController::RoutingError: uninitialized cons

2019-05-01 17:30发布

问题:

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

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

回答1:

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



回答2:

Right now you have Api::ApiController.
Your app/controllers/api/v1/api_controller.rb is missing V1 in namespace

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

UPDATE

If your ApiController is outside V1 folder then you should do

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