rails资源深度嵌套

时间:2014-01-10 22:47:39

标签: ruby-on-rails routes

我已经阅读了一些文章,我知道,继承超过2级的深度资源是不好的,但现在让我们忘记它了。

让我们想象一下,我有这样的模特:

 car_brand
   car_model
     car_type

在路线上我可以这样写:

namespace :admin do
    resources :car_brands  do
          resources :car_models  do
            resources :car_types
          end
        end
end

但我没有找到任何好文章,如何使用这样的架构生成我的控制器和视图

  1. 我需要在控制器类头中编写什么,比如:class

    Admin :: CarBrands :: CarModelsController< ApplicationController中

  2. 还是什么?我需要清楚了解这一刻,每个子模型视图必须在子文件夹视图中,或者如何?请不要downvote,不要关闭它,我真的很困惑,我不知道怎么去(

2 个答案:

答案 0 :(得分:2)

Admin::CarTypesController < ApplicationControllercontrollers/admin文件夹中的

car_types_controller.rb

运行rake routes并查看此行,例如:

/admin/car_brands/:car_brand_id/car_models/:car_model_id/car_types(.:format) 

这是将映射Admin::CarTypesController#index metod的uri模式。在params哈希中,您会找到:car_brand_id:car_model_id

答案 1 :(得分:1)

what i need to write in controller class header, something like: class
Admin::CarBrands::CarModelsController < ApplicationController

部分是,部分不是。是的,因为您已经命名空间路由,即在namespace :admin和否,因为嵌套资源并不意味着命名空间控制器为CarBrands::CarModelsController

由于所有resources都在命名空间admin内,因此您将按如下方式生成所有控制器:

rails g controller admin/car_brands
rails g controller admin/car_models
rails g controller admin/car_types

执行上面的每个命令会将控制器类和视图目录以及其他测试特定文件放在相应的目录中。您的问题更多地是针对控制器和视图,因此关注的目录是:

- app/controllers/admin/
- app/views/admin/car_brands/
- app/views/admin/car_models/
- app/views/admin/car_types/

CarBrandsController的控制器声明如下:

class Admin::CarBrandsController < ApplicationController
  ...
end

通过这些设置,现在由您决定如何将每个控制器作为资源进行管理。如果您将car_types嵌套在car_models之内,那么car_models控制器中的方法也会在参数中预期car_type_id。如果您没有嵌套car_types资源,那么资源就是它自己的独立资源,并且不依赖于任何其他资源。