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

Ada*_*dam 15 ruby ruby-on-rails ruby-on-rails-3.2

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

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

# routes.rb
resources :users do  
  resource :schedule  
end
Run Code Online (Sandbox Code Playgroud)

我在控制器/用户/内部设置了schedule_controller.rb,因为我认为它应该是:

class Users::ScheduleController < ApplicationController

  # Controller methods here...

end
Run Code Online (Sandbox Code Playgroud)

运行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
Run Code Online (Sandbox Code Playgroud)

但是,导航到/ users /:user_id/schedule会返回以下错误:

uninitialized constant SchedulesController
Run Code Online (Sandbox Code Playgroud)

我的问题可能是只什么想法是,就是有事情做与嵌套的资源或宣布一个单一的资源,我要去什么地方错了.

我正在使用帮手

new_user_schedule_path(current_user)
Run Code Online (Sandbox Code Playgroud)

链接到我的"新"视图时.

And*_*all 16

它应该是SchedulesController,而不是Users::ScheduleController.控制器只应在路由器命名namespace空间时进行命名空间.控制器名称也应始终为复数.

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


Rya*_*igg 5

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

class Users::SchedulesController < ApplicationController
Run Code Online (Sandbox Code Playgroud)

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

我问这个的原因是因为通常在 Rails 中,嵌套的资源控制器没有命名空间。如果您想在命名空间下以特殊方式修改控制器,则只能命名控制器。一个常见的例子是在 admin 命名空间下有一些控制器,从BaseController该命名空间中的a 继承,这将限制只有管理员访问这些控制器。

选项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
Run Code Online (Sandbox Code Playgroud)

保留已生成的所有内容。


Psh*_*ski 5

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

resources :users do
  resource :schedules, controller: 'users/schedules'
end
Run Code Online (Sandbox Code Playgroud)