20

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

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

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

我在 controllers/users/ 中有一个 schedule_controller.rb ,我认为它应该是这样设置的:

class Users::ScheduleController < ApplicationController

  # Controller methods here...

end

运行 rake:routes 显示

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

4 回答 4

20

应该是SchedulesController,不是Users::ScheduleController。仅当路由使用命名空间时,控制器才应命名空间namespace。控制器名称也应该总是复数。

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

于 2012-10-29T04:05:32.353 回答
5

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

class Users::SchedulesController < ApplicationController

还是您这样做只是因为日程安排是用户的“次要事物”?

我问这个的原因是因为通常在 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

保留所有已生成的内容。

于 2012-10-29T04:05:24.383 回答
4

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

resources :users do
  resource :schedules, controller: 'users/schedules'
end
于 2017-11-11T00:19:48.410 回答
0

将资源 :users 替换为命名空间 :users

因为您的计划控制器位于用户文件夹内。class Users::ScheduleController < ApplicationController # 这里的控制器方法... end

于 2017-08-08T18:25:22.103 回答