Неинициализированная константа «Имя контроллера»

#ruby-on-rails #ruby #devise

Вопрос:

У меня ошибка с моими маршрутами/ресурсами и контроллерами.

У меня есть следующее в routes.rb:

 # routes.rb
resources :users do  
  resource :schedule  
end
 

И у меня есть schedule_controller.rb внутри контроллеров/пользователей/ настроенный так, как я думаю, это должно быть:

 class Users::ScheduleController < ApplicationController

  # Controller methods here...

end
 

Запуск грабель:маршруты показывают

 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/:идентификатор пользователя/расписание возвращается следующая ошибка:

 uninitialized constant SchedulesController
 

Мои единственные мысли о том, в чем может быть проблема, заключаются в том, что это как-то связано с вложенными ресурсами или объявлением одного ресурса, и я где-то ошибаюсь.

Я использую помощника

 new_user_schedule_path(current_user)
 

при ссылке на мой «новый» вид.

Комментарии:

1. Обратите внимание, что ScheduleController не является SchedulesController.

2. Я пришел к этому вопросу, ища ошибку в названии, но не имея проблемы с вложенными ресурсами в пространстве имен. В моем случае файл контроллера не был помещен в нужную папку .

3. В моем случае имя файла контроллера было не в правильном формате. Имя файла должно быть «schedules_controller.rb».

Ответ №1:

Так и должно быть SchedulesController , а не Users::ScheduleController так . Контроллеры должны располагаться в пространстве имен только в том случае, если маршрут имеет пространство namespace имен . Имена контроллеров также всегда должны быть во множественном числе.

То, что вы создаете, является вложенным ресурсом, а не пространством имен.

Комментарии:

1. Пример единственного ресурса в руководстве по маршрутизации имеет имя класса во множественном числе, поэтому я ожидаю, что Эндрю прав, и имя вашего контроллера должно быть во множественном числе.

2. Иногда множественное число неверно, особенно для сложных множественных или сложных слов. В этих случаях вы можете изменить файл inflections.rb, чтобы rails искал «множественное число».

3. Спасибо за ваш ответ. Я действительно путал вложенные ресурсы и пространство имен. Кроме того, использование единственного «расписания» также вызывало проблемы.

Ответ №2:

Является ли пространство имен SchedulesController намеренным? т. е. вы действительно хотите это сделать?

 class Users::SchedulesController < ApplicationController
 

Или вы делаете это только потому, что расписания-это «второстепенная вещь» от пользователей?

Причина, по которой я спрашиваю об этом, заключается в том, что обычно в Rails вложенные контроллеры ресурсов не имеют пространства имен. Вы бы назвали контроллер пространством имен только в том случае, если бы хотели особым образом изменить контроллеры в пространстве имен. Распространенным примером этого может быть наличие некоторых контроллеров в пространстве имен администратора, унаследованных от 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:

В вашем файле routes.rb вам нужно указать контроллер следующим образом:

 resources :users do
  resource :schedules, controller: 'users/schedules'
end
 

Комментарии:

1. Это должно быть приемлемым ответом, поскольку, похоже, первоначальный запрос был о вложенном ресурсе, а не о пространстве имен. Если вы не укажете контроллер во вложенном ресурсе, как это было сделано здесь, вы получите ошибку, с которой столкнулся исходный плакат.

Ответ №4:

замените ресурсы :пользователи на пространство имен :пользователи

Потому что ваш контроллер расписания находится в папке «Пользователи». пользователи класса::Контролер расписания