【问题标题】:rails namespaced route with root only works in development带有 root 的 rails 命名空间路由仅在开发中有效
【发布时间】:2012-01-09 12:00:58
【问题描述】:
namespace :admin do 
  root :to => "admin#index"
end

我可以访问localhost:3000/admin,它可以工作。 当我部署到 heroku myapp.herokuapp.com/admin 时没有。它产生了这个

ActionController::RoutingError (uninitialized constant Admin::AdminController):

我的控制器实际上是 AdminController,而不是 Admin::AdminController,我不太确定有什么区别或如何解决这个问题。

同样,这一切都在本地工作。

【问题讨论】:

    标签: ruby-on-rails routing heroku ruby-on-rails-3.1


    【解决方案1】:

    您可以在 rake routes 输出中看到,对于这个命名空间的路由 rails 使用 :controller => 'admin/admin'。在查找控制器类时,它将admin/admin 转换为Admin::AdminController。因此命名空间路由的控制器通常放在app/controllers/namespace_name 目录下并包装在NamespaceName 模块中。在您的情况下,它应该是在app/controllers/admin/admin_controller.rb 中定义的Admin::AdminController 类。

    尽管如此,您的配置在开发中运行良好但在生产模式下中断的原因确实很有趣(我尝试并成功复制了它)。我相信这与在生产模式下加载和缓存类有关,因为在config/environments/development.rb 中设置config.cache_classes = true 也会导致它在开发模式下中断。

    正如 zoltarSpeaks 所说,它应该是 root :to => "admin#index" 而不是 root :to => "Admin#index"

    另外需要注意的是,路由的命名空间通常在有多个相关控制器时使用。如果您只需要单个AdminController,您可以像这样配置您的路线:

    resources :admin, :only => :index
    

    在这种情况下,不需要进行其他更改(如果您想要除index 之外的其他默认操作,只需删除:only 选项)。

    【讨论】:

    • 路线实际上为我显示/admin。但是将它放在管理文件夹中并使用 Admin::AdminController 语法有效。唯一的问题是我的视图文件夹结构有点不干净views/admin/admin/index.html.erb(这可能是你的意思是admin/admin?)以前我有/admin/index.html.erb其他管理部分控制器的文件夹。
    • 哦,现在我发现了一个问题。我有 2 个其他控制器作为我的管理系统的一部分,它们的定义如下:Admin::OrdersController < AdminController 访问这些控制器会产生此错误:uninitialized constant AdminController
    • 为此,我通常将基本管理控制器定义为Admin::ApplicationController,然后将其他控制器定义为Admin::OrdersController < Admin::ApplicationController。不过,在我的情况下,这个基本 ApplicationController 控制器通常没有任何视图,并且只包含后来在其他管理控制器中使用的东西(例如,前置过滤器)。
    【解决方案2】:

    我不在我的笔记本电脑旁,所以无法检查,但是:

    root :to => "Admin#index"
    

    应该是:

    root :to => "admin#index"
    

    相反?可能没什么区别。

    你在控制器中有一个 Admin 文件夹,然后里面有一个 Admin 控制器吗?

    如果您也可以向我们展示您的控制器代码,那将很有帮助,谢谢。

    【讨论】:

    • 大写的“A”只是我的问题中的一个错字,抱歉。我在 admin 文件夹中没有我的管理控制器,但其他子控制器在管理控制器中。我也尝试将管理控制器放在该文件夹中。
    猜你喜欢
    • 2011-10-10
    • 2011-09-05
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2018-09-23
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多