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

时间:2012-10-29 03:55:58

标签: ruby-on-rails ruby ruby-on-rails-3.2

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

我在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)

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

4 个答案:

答案 0 :(得分:15)

应该是SchedulesController,而不是Users::ScheduleController。只有当路由为namespaced with namespace时,控制器才应该被命名空间。控制器名称也应始终为复数。

您要创建的是nested resource,而不是命名空间。

答案 1 :(得分:3)

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

保留所有已生成的内容。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

替换资源:用户来 namespace:users

因为您的计划控制器位于用户文件夹中。 class Users :: ScheduleController&lt; ApplicationController的   #控制器方法在这里...... 端