6

我正在尝试将我的 Rails 应用程序组织到两个提供相同资源但具有不同控制器和视图的命名空间中。类似于以下场景:

路线.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

使用脚手架,我创建了控制器结构:

rails g 控制器 api/蜂箱

rails g 控制器 api/蜂箱/蜜蜂

rails g 控制器 api/蜂箱/蜂窝

我为控制器获得的文件夹结构听起来像这样:

+ 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/beehives/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

我做错了什么?

4

1 回答 1

5

resources :beehive+ nestedresources :bees也不需要嵌套您各自的控制器。这只是构建 URL 的一种方式。因此,您的应用自然会要求 Api::BeesController而不是Api::Beehives::BeesController.

如果您有任何疑问,请使用rake routes命令检查您的路由及其关联的控制器。

于 2012-10-11T18:48:04.827 回答