未初始化的常量“控制器名称”

我的路由/资源和控制器出错了。

我在routes.rb中有以下内容:

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

我在控制器/用户/内部设置了schedule_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) 

链接到我的“新”视图时。

它应该是SchedulesController ,而不是Users::ScheduleController 。 当路由器使用namespace空间时,控制器应仅被命名namespace 。 控制器名称也应始终为复数。

您正在创建的是嵌套资源 ,而不是命名空间资源 。

SchedulesController的命名空间是故意的吗? 你真的有意这样做吗?

 class Users::SchedulesController < ApplicationController 

或者你只是这样做,因为时间表是用户的“子事”?

我之所以这么说是因为通常在Rails中,嵌套资源控制器不是命名空间。 如果要在命名空间下以特殊方式修改控制器,则只能命名控制器。 一个常见的例子是在管理命名空间下有一些控制器,inheritance自该命名空间内的BaseController ,它只会限制管理员访问这些控制器。

选项1

如果您没有故意命名此控制器,那么您希望从控制器中删除Users::前缀,并将其移回app/controllers/schedules_controller.rb ,帮助app/helpers/schedules_helper.rb返回app/helpers/schedules_helper.rb和观看回到app/views/schedules 。 也许您运行了一个也生成了Users::Schedule模型的生成器,该模型还需要重命名为Schedule并移回app/models/schedule.rb

选项2

如果您故意命名此控制器,那么您希望在路由中执行此操作:

 namespace :users do resources :schedules end 

留下应该生成的所有内容。

在routes.rb中,您需要像这样指定控制器:

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

替换资源:用户到命名空间:用户

因为您的计划控制器位于用户文件夹中。 class Users :: ScheduleController