创建管理区域时有两个控制器还是一个?

时间:2014-04-30 09:58:32

标签: ruby-on-rails

使用namespace方法创建管理区域时,会显示以下路线:

resources :stories
namespace :control_panel do
    resources :stories
end

给了我:

   control_panel_stories GET    /control_panel/stories(.:format)          control_panel/stories#index
                         POST   /control_panel/stories(.:format)          control_panel/stories#create
 new_control_panel_story GET    /control_panel/stories/new(.:format)      control_panel/stories#new
edit_control_panel_story GET    /control_panel/stories/:id/edit(.:format) control_panel/stories#edit
     control_panel_story GET    /control_panel/stories/:id(.:format)      control_panel/stories#show
                         PATCH  /control_panel/stories/:id(.:format)      control_panel/stories#update
                         PUT    /control_panel/stories/:id(.:format)      control_panel/stories#update
                         DELETE /control_panel/stories/:id(.:format)      control_panel/stories#destroy

Rails似乎正在推动我为Story资源创建两个控制器。一个位于app/controllers/stories_controller.rb,一个位于app/controllers/control_panel/stories_controller.rb

我应该使用这两个控制器吗?如果我只是使用stories_controller,它将保存一个文件,但如果用户是管理员,则必须在每个操作中重定向回control_panel命名空间视图。我应该使用两个控制器吗?

2 个答案:

答案 0 :(得分:1)

使用controller选项。

类似的东西:

namespace :control_panel do
  resources :stories, controller: 'stories'
end

对于自定义操作,请使用actions选项

resources :stroies, actions: [:index, :show]
namespace :control_panel do
  resources :stories, controller: 'stories', except: [:index, :show]
end

因此,您可以查看没有命名空间的故事,但管理它们只能在control_panel命名空间中工作。

另外,请尝试active_admin gem进行管理。它简单而有用

答案 1 :(得分:0)

如果你有namespaced controller,它基本上把它放在另一个文件夹

后端有一些重要的继承内容,但简单地说,您将有另一个名为apps/controllers/control_panel的文件夹,您必须将该文件添加到:

#app/controllers/control_panel/stories_controller.rb
Class ControlPanel::StoriesController < ApplicationController
   # stuff
end

这与您的“标准”控制器不同,后者将位于标准控制器部分。 This is a great tutorial for you了解其工作原理


<强> DRY

如果不是DRY,您可能想知道为什么要使用它

答案是两个控制器允许您执行不同的任务/功能。例如,在我们的管理区域中,我们使用:

#config/routes.rb
resources :stories, only: [:index, :show]
namespace :admin do
    resources :stories, except: :show
end

这使我们能够定义每个控制器可以执行的操作(使其更安全)。您可以使用@asiniy的解决方案,但它会将您的所有代码放在一个控制器中,这可能是个问题