#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:
замените ресурсы :пользователи на пространство имен :пользователи
Потому что ваш контроллер расписания находится в папке «Пользователи». пользователи класса::Контролер расписания