使用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命名空间视图。我应该使用两个控制器吗?
答案 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
的解决方案,但它会将您的所有代码放在一个控制器中,这可能是个问题