Неинициализированная константа "Имя контроллера"
У меня возникла ошибка с моими маршрутами/ресурсами и контроллерами.
У меня есть на маршрутах route.rb:
# routes.rb
resources :users do
resource :schedule
end
И у меня есть controller_controller.rb внутри контроллеров/пользователей/настроен, как я думаю, это должно быть:
class Users::ScheduleController < ApplicationController
# Controller methods here...
end
Запуск rake: показывает маршруты
user_schedule POST /users/:user_id/schedule(.:format) schedules#create
new_user_schedule GET /users/:user_id/schedule/new(.:format) schedules#new
edit_user_schedule GET /users/:user_id/schedule/edit(.:format) schedules#edit
GET /users/:user_id/schedule(.:format) schedules#show
PUT /users/:user_id/schedule(.:format) schedules#update
Однако при переходе к /users/: user_id/schedule возвращается следующая ошибка:
uninitialized constant SchedulesController
Мои мысли о том, что может быть проблемой, это то, что связано с вложенными ресурсами или объявлением одного ресурса, и я где-то ошибаюсь.
Я использую помощник
new_user_schedule_path(current_user)
при соединении с моим "новым" представлением.
Ответы
Ответ 1
Он должен быть SchedulesController
, а не Users::ScheduleController
. Контроллеры должны иметь место только для имен, когда маршрут namespaced с namespace
. Названия контроллеров также должны быть множественными.
То, что вы создаете, представляет собой вложенный ресурс, а не файл с именами.
Ответ 2
Является ли назначение имен SchedulesController
преднамеренным? то есть вы действительно хотите это сделать?
class Users::SchedulesController < ApplicationController
Или вы делаете это только потому, что расписания являются "суб-вещью" от пользователей?
Причина, по которой я спрашиваю об этом, заключается в том, что, как правило, в Rails вложенные контроллеры ресурсов не занимают место. Вы бы просто прописались над контроллером, если бы вы хотели модифицировать контроллеры особым образом в пространстве имен. Общим примером этого может быть наличие некоторых контроллеров в пространстве имен admin, наследующих от BaseController
внутри этого пространства имен, которое ограничивало бы только админов от доступа к этим контроллерам.
Вариант 1
Если вы не намеренно пропустили пробел в этом контроллере, вы хотите удалить префикс Users::
из своего контроллера и переместить его обратно в app/controllers/schedules_controller.rb
, а затем вернуться к app/helpers/schedules_helper.rb
и вернуться к app/views/schedules
. Возможно, вы запустили генератор, который также сгенерировал модель Users::Schedule
, которую также нужно переименовать в Schedule
и вернуться к app/models/schedule.rb
.
Вариант 2
Если вы намеренно прописали пробел в этом контроллере, то вы хотите сделать это на своих маршрутах:
namespace :users do
resources :schedules
end
Оставьте все, что было создано, как должно быть.
Ответ 3
заменить ресурсы: пользователи на
пространство имен: пользователи
Поскольку ваш контроллер расписания находится внутри папки пользователя.
класс Пользователи:: ScheduleController < ApplicationController # Методы контроллера здесь...
конец
Ответ 4
В ваших route.rb вам нужно указать контроллер следующим образом:
resources :users do
resource :schedules, controller: 'users/shedules'
end