使用root的rails命名空间路由仅适用于开发

时间:2011-11-30 08:00:21

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

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,我不太确定区别是什么或如何解决这个问题。

同样,它都在本地运作。

2 个答案:

答案 0 :(得分:2)

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

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

并且 zoltarSpeaks 注意到它应该是root :to => "admin#index"而不是root :to => "Admin#index"

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

resources :admin, :only => :index

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

答案 1 :(得分:0)

我离开了我的笔记本电脑,所以无法检查,但是:

root :to => "Admin#index"

应该是:

root :to => "admin#index"

代替?它可能没有任何区别。

在控制器中是否有Admin文件夹,其中包含Admin控制器?

如果您也可以向我们展示您的控制器代码,那将非常有用。