7

我已经为网站开发了几个星期的CMS后端。这个想法是首先在后端创建所有的东西,这样它就可以管理将在主网站上显示的数据库和信息。在Rails中创建管理员目录

截至目前,我目前已将所有代码安装在正常的rails MVC结构中。所以用户管理员是/用户和视频是/视频。

我的计划是为此获取代码并将其移至/ admin目录。所以上面的两个控制器需要被/ admin/users和/ admin/videos访问。我不知道如何处理这个问题(将/ admin添加为前缀),我也不确定如何管理逻辑。我想要做的是设置一个额外的'中间'控制器,当访问/ admin目录时,它以某种方式嵌套在ApplicationControler和目标控制器之间。这样,任何额外的标志和重载的方法都可以为/ admin部分生成(我相信我也可以使用过滤器)。

如果这是工作,那么下一个问题将分离视图逻辑(但这只是重命名文件夹等)。

要么我这样做,要么我有两个共享他们之间的MVC代码的轨道实例(我猜也是数据库),但我担心会导致大量的重复错误。

任何想法,我应该怎么做呢?

非常感谢!

回答

6

如果您不介意每个资源都有两个控制器,那么您可以有一个单独的“admin”命名空间。我喜欢这种方式,因为管理部分与公共部分完全不同。管理员控制器执行所有CRUD操作,而公共的只执行显示和索引操作。

的routes.rb:

map.namespace :admin do |admin| 
    admin.resources :users 
    admin.resources :videos 
end 

map.resources :videos, :only => [:index, :show] 

你的控制器可以是这样的:

class VideosController < PublicController; end 

class Admin::VideosController < Admin::AdminController; end 

class PublicController < ApplicationController 
    layout 'public' 
    before_filter :load_public_menu 
end 

class Admin::AdminController < ApplicationController 
    layout 'admin' 
    before_filter :login_required, :load_admin_menu 
end 

命名空间的控制器和视图具有应用程序/控制器和应用程序/视图目录内自己的子目录。如果您使用form_for帮手,则需要修改其参数:

form_for [:admin, @video] do |f| 
1

可以在config/routes.rb做到这一点没有额外的控制器,相对容易:

# non-admin routes 
# your args could include :only => [:index,:show] for the non-admin routes 
# if you wanted these to be read-only 
map.resources :users, ...your args..., :requirements => { :is_admin => false } 
map.resources :videos, ...your args..., :requirements => { :is_admin => false } 
# admin routes 
map.resources :users, ...your args..., :path_prefix => '/admin', \ 
    :name_prefix => 'admin_', :requirements => { :is_admin => true } 
map.resources :videos, ...your args..., :path_prefix => '/admin', \ 
    :name_prefix => 'admin_', :requirements => { :is_admin => true } 

什么:requirements实际上做在这里,因为我给它一个恒定的,而不是一个正则表达式,只是添加params[:is_admin]当通过访问这条路线。所以你可以在你的控制器中检查这个值,并渲染不同的视图,或者如果两个视图相似,你可以在视图中检查它。在非管理版本中包含要求false非常重要,否则人们可以使用/users/?is_admin=true

:name_prefix编辑路径名称,所以您有例如admin_video_path(123)以及video_path(123)

测试Rails 2.3.5,其他版本可能有所不同。有关RESTful路由上可用选项的更多信息,请参阅ActionController::Resources docs

+0

谢谢各位。这正是我需要的。 – matsko 2010-06-03 17:22:21