具有嵌套资源的命名空间Rails 3.2.8

der*_*vis 6 resources routes nested namespaces ruby-on-rails

我正在尝试将我的Rails应用程序组织到两个名称空间中,这两个名称空间提供相同的资源,但具有不同的控制器和视图.类似下面的cenario:

的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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

控制器/ beehives_controller.rb

class Api::BeehivesController < ApplicationController 
Run Code Online (Sandbox Code Playgroud)

控制器/ API/beehives_controller.rb

class Api::BeehivesController < ApplicationController 
Run Code Online (Sandbox Code Playgroud)

控制器/ API /蜂箱/ bees_controller.rb

class Api::Beehives::BeesController < ApplicationController 
Run Code Online (Sandbox Code Playgroud)

嗯,这很容易.在此上下文中,/beehives/1将路由到根命名空间(用于Web应用程序)和/api/beehives/1"api"命名空间(用于提供RESTful Web服务).这工作得很好.问题是当我尝试访问时/api/beehives/1/bees,由于某种原因,命名空间不适用于嵌套资源而Rails吐出此错误:

uninitialized constant Api::BeesController
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

jdo*_*doe 5

resources :beehive+嵌套resources :bees也不需要嵌套各自的控制器.这只是构建URL的一种方式.所以,你的应用程序自然会要求 Api::BeesController而不是Api::Beehives::BeesController.

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

  • @DerekWillianStavis`resources`接受`:module =>'behives'`选项.您也可以使用`scope:module =>'behives'do ... end`包装器作为嵌套资源. (6认同)