#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, я получаю сообщение об ошибке в последнем маршруте и всех маршрутах в командном модуле. Если я изменю проект и сохраню его (только одно пустое место), а затем выполню маршрут задач и после маршрута входа в систему я получу сообщение об ошибке в последнем маршруте и всех маршрутах в модуле входа в систему.
В этом нет никакого смысла…
Комментарии:
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. Я просто не видел его в то время. Я никогда не крал никакого ответа.