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

23

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

在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

我对问题可能的原因唯一的想法是它与嵌套资源或声明单个资源有关,我在某个地方出错了。

我正在使用helper

new_user_schedule_path(current_user)

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


请注意,ScheduleController和SchedulesController是不同的控制器。 - matt
我在寻找标题中的错误时遇到了这个问题,但并没有嵌套与命名空间资源的问题。在我的情况下,控制器文件没有放置在正确的文件夹中 - stralsi
1
在我的情况下,控制器文件名格式不正确。文件名应为“schedules_controller.rb”。 - amayer171292591
4个回答

21

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

你正在创建一个嵌套的资源,而不是一个命名空间化的资源。


路由指南中的单数资源示例有一个复数类名,因此我认为安德鲁是正确的,你的控制器名称应该是复数形式。 - Jared Beck
有时候复数形式是错误的,特别是对于复杂的复数或复合词。在这些情况下,您可以更改inflections.rb文件,以便Rails查找“复数形式”。 - Tsagadai
谢谢你的回答。我确实混淆了嵌套资源和命名空间。此外,使用单数的“schedule”也会导致问题。 - Adam

6

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

不要改动已经生成的任何内容。


5
在你的routes.rb文件中,需要像这样指定控制器:
resources :users do
  resource :schedules, controller: 'users/schedules'
end

1
这应该是被接受的答案,因为原始问题似乎是关于嵌套资源而不是命名空间的。如果您在嵌套资源中未指定控制器,就像这里所做的那样,您将收到原始帖子遇到的错误。 - colemerrick

0

将 resources :users 替换为 namespace :users

因为您的日程控制器位于 users 文件夹中。 class Users::ScheduleController < ApplicationController # 控制器方法在这里... end


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接