在Rails中创建Admin目录

时间:2010-06-03 06:45:32

标签: ruby-on-rails ruby routing content-management-system rails-routing

我已经为网站开发了几个星期的CMS后端。我们的想法是首先在后端制作所有内容,以便它可以管理将在主网站上显示的数据库和信息。

截至目前,我目前在普通的rails MVC结构中设置了所有代码。因此,用户管理员/用户和视频是/视频。

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

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

要么我这样做,要么我有两个在它们之间共享MVC代码的rails实例(我猜数据库也是如此),但我担心这会导致很多重复错误。

关于我应该怎样做的任何想法?

非常感谢!

2 个答案:

答案 0 :(得分:6)

如果您不介意为每个资源配备两个控制器,则可以使用单独的“admin”命名空间。我喜欢这种方式,因为管理部分与公共部分完全不同。管理控制器实现所有CRUD操作,而公共控制操作仅实现show和index操作。

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

命名空间控制器和视图在app / controllers和app / views目录中有自己的子目录。如果您使用form_for帮助程序,则需要修改其参数:

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

答案 1 :(得分: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