【问题标题】:Uninitialized constant "Controller Name"未初始化的常量“控制器名称”
【发布时间】:2012-10-29 03:55:57
【问题描述】:

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

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

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

【问题讨论】:

  • 观察 ScheduleController 不是 SchedulesController。
  • 我在搜索标题中的错误时遇到了这个问题,但没有遇到 nestednamespaced 资源问题。在我的情况下,控制器文件没有放在正确的文件夹中
  • 在我的情况下,控制器文件名的格式不正确。文件名应为“schedules_controller.rb”

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


【解决方案1】:

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

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

【讨论】:

  • routing guide 中的单数资源示例有一个复数的类名,所以我认为 Andrew 是对的,你的控制器名称应该是复数。
  • 有时复数是错误的,尤其是复杂的复数或复合词。在这些情况下,您可以更改您的 inflections.rb 文件,以便 rails 查找“复数”。
  • 感谢您的回答。我确实混淆了嵌套资源和命名空间。此外,使用单数“时间表”也会导致问题。
【解决方案2】:

SchedulesController 的命名空间是故意的吗?也就是说,您真的是要这样做吗?

class Users::SchedulesController < ApplicationController

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

我问这个的原因是因为通常在 Rails 中,嵌套的资源控制器没有命名空间。如果您想在命名空间下以特殊方式修改控制器,则只能命名控制器。一个常见的例子是在 admin 命名空间下有一些控制器,从该命名空间内的 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

保留所有已生成的内容。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 这应该是公认的答案,因为最初的要求似乎是嵌套资源 - 而不是命名空间。如果您没有像这里所做的那样在嵌套资源中指定控制器,您将收到原始发布者遇到的错误。
    【解决方案4】:

    替换资源:用户到 命名空间:用户

    因为您的计划控制器位于用户文件夹中。 类用户::ScheduleController

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 2012-10-03
      • 2013-11-18
      • 2016-05-08
      • 1970-01-01
      • 2015-10-25
      相关资源
      最近更新 更多