我正在尝试将我的Rails应用程序组织到两个名称空间中,这两个名称空间提供相同的资源,但具有不同的控制器和视图。类似下面的内容:
的routes.rb
resources :beehives do
resources :bees
resources :honeycombs
end
namespace :api do
resources :beehive, only: [:show] do
resources :bees, only: [:index, :show]
resources :honeycombs, only: [:index, :show]
end
end
使用scaffold,我创建了控制器结构:
rails g controller api / beehives
rails g controller api / beehives / bees
rails g controller api / beehives / honeycombs
我为控制器获得的文件夹结构听起来像这样:
+ app
+ controllers
- beehives_controller.rb
- bees_controller.rb
- honeycombs_controller.rb
+ api
- beehives_controller.rb
+ beehives
- bees_controller.rb
- honeycombs_controller.rb
控制器/ beehives_controller.rb
class Api::BeehivesController < ApplicationController
控制器/ API / beehives_controller.rb
class Api::BeehivesController < ApplicationController
控制器/ API /蜂箱/ bees_controller.rb
class Api::Beehives::BeesController < ApplicationController
嗯,这很容易。在此上下文中,/beehives/1
将路由到根命名空间(用于Web应用程序)和/api/beehives/1
到“api”命名空间(用于提供RESTful Web服务)。这工作得很好。问题是当我尝试访问/api/beehives/1/bees
时,由于某种原因,命名空间不适用于嵌套资源而Rails吐出此错误:
uninitialized constant Api::BeesController
我做错了什么?
答案 0 :(得分:5)
resources :beehive
+嵌套resources :bees
也不需要嵌套您的控制器。这只是构建URL的一种方式。因此,您的应用自然会要求Api::BeesController
而不是Api::Beehives::BeesController
。
如果您有任何疑问,请使用rake routes
命令检查您的路线及其相关控制器。