未初始化的常量“控制器名称”
我的路由/资源和控制器出错了。
我在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