命名嵌套资源(控制器)

时间:2013-06-12 12:04:34

标签: ruby-on-rails ruby

如果我必须拥有那些看起来像这样的控制器

namespace :somearea do
  resources :users do
    resources :posts do
     resources :comments
    end
  end

然后我如何命名他们?可以将它们命名如下:

class SomeArea::BaseController < ApplicationController

end

class SomeArea::UsersController < SomeArea::BaseController

end

class SomeArea::Users::PostsController < SomeArea::BaseController

end

class SomeArea::Users::Posts::CommentsController < SomeArea::BaseController

end

这不是我项目中的确切层次结构,但是我希望能够理解我应该如何命名控制器。

3 个答案:

答案 0 :(得分:2)

在这种情况下,嵌套路由仅适用于路由的设置方式。您不需要像在此处一样将控制器嵌套在模块中。事实上,我认为如果你这样做,你可能需要改变路由才能找到嵌套的控制器。我想说你想要以下内容:

class SomeArea::BaseController < ApplicationController
end

class SomeArea::UsersController < SomeArea::BaseController
end

class SomeArea::PostsController < SomeArea::BaseController
end

class SomeArea::CommentsController < SomeArea::BaseController
end
编辑 - 正如在zeantsoi的回答中所说的那样,深入嵌套这些路线被认为是不好的做法,或者至少应该尽可能避免。但是,如果由于某种原因你需要这样做,我仍然会说你不应该在代码中嵌套模块中的所有类。这会让事情变得更加麻烦。

答案 1 :(得分:0)

您列出的示例确实是语法上可接受的,但创建此类深层嵌套路由并不是一种好习惯。来自canonical Rails guide on routing

  

深度嵌套的资源很快变得很麻烦...... 资源不应该嵌套超过1级。

该指南继续引用有关嵌套Rails路由的this article by Jamis Buck。如果你真的要像你描绘的那样嵌套你的路线,那么理解这样做的含义是值得的。

答案 2 :(得分:0)

您可以执行以下操作:

class SomeAreaController < ApplicationController
end

class UsersController < ApplicationControllerr
end

class PostsController < ApplicationController
end

class CommentsController < ApplicationController
end

因为您提出的方式仅暗示目录结构,并且它不会推断嵌套资源。例如SomeArea::Users::PostsController表示您的posts_controller.rb位于app/controllers/some_area/users/文件夹中。

用户/帖子/评论从SomeArea::BaseController继承的事实取决于您,但同样不能明确归因于您正在考虑嵌套资源这一事实。