【问题标题】:Creating an Admin directory in Rails在 Rails 中创建 Admin 目录
【发布时间】:2011-02-27 04:09:43
【问题描述】:

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

截至目前,我的所有代码都设置在正常的 rails MVC 结构中。所以用户管理员是/users,视频是/videos。

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

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

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

关于我应该如何做这件事有什么想法吗?

非常感谢!

【问题讨论】:

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


    【解决方案1】:

    如果您不介意每个资源有两个控制器,您可以有一个单独的“管理员”命名空间。我喜欢这种方式,因为管理部分与公共部分完全不同。管理控制器实现所有 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
    

    命名空间控制器和视图在 app/controllers 和 app/views 目录中有自己的子目录。如果你使用form_for helper,你需要修改它的参数:

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

    【讨论】:

      【解决方案2】:

      你可以在没有额外控制器的情况下做到这一点,在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

      【讨论】:

      • 谢谢你们。这正是我所需要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 2015-07-10
      • 1970-01-01
      相关资源
      最近更新 更多