如何在Rails 3中使用两个设计模型(User& Admin)实现单独的Admin(命名空间或作用域)?

时间:2011-05-12 21:45:02

标签: ruby-on-rails-3 devise cancan

将此视为挑战而非其一般方法。我提到这一点的原因是,通常首选将管理员可访问的功能合并到public facing site中。这就是所需要的:

  • 为用户设计模型,访问面向公众的网站的访问者
  • 为管理员设计模型
  • 将管理员“区域”命名为/admin。管理员只能从此路线登录。
  • 用户可以直接从该网站面向公众的着陆页注册;根据默认设计生成的路线,他们不会被迫访问/users/sign_up
  • 考虑覆盖默认设计控制器

谢谢, 麦克

1 个答案:

答案 0 :(得分:0)

以下似乎我在正确的方向上取得了一些进展;这至少为用户和管理员提供了相同的开箱即用的设计功能,具有自定义路由,

  match 'admin', :controller => 'admin'

  namespace :admin do
    # to be updated later... 
  end

  devise_for :users
  #devise_for :admins, :path => "admin"  # this works but uses the default
                                         # Devise::SessionController
  devise_for :admins, 
    :controllers => { 
      :sessions => "admin/sessions", 
      :passwords => "admin/passwords",
      :registrations => "admin/registrations" }, :path => "admin",
    :skip => [:sessions, :passwords, :registrations] do
    get 'admin/sign_in' => 'admin/sessions#new', :as => :new_admin_session
    post 'admin/sign_in' => 'admin/sessions#create', :as => :admin_session
    get 'admin/sign_out' => 'admin/sessions#destroy', :as => :destroy_admin_session

    get 'admin/sign_up' => 'admin/registrations#new', :as => :new_admin_registration
    get 'admin/account' => 'admin/registrations#edit', :as => :edit_admin_registration
    post 'admin/account' => 'admin/registrations#create', :as => :admin_registration
    get 'admin/cancel' => 'admin/registrations#cancel', :as => :cancel_admin_registration
    put 'admin/account' => 'admin/registrations#update'
    delete 'admin/account' => 'admin/registrations#destroy'

    post 'admin/password' => 'admin/passwords#create', :as => :admin_password
    get 'admin/password/new' => 'admin/passwords#new', :as => :new_admin_password
    get 'admin/password/edit' => 'admin/passwords#edit', :as => :edit_admin_password    
    put 'admin/password' => 'admin/passwords#update'
  end

想法?

警告:在此示例中,我在管理模型 中包含了:registerable devise模块,用于在开发期间进行测试。最终将删除sign_up路线。

许多搜索产生了(请注意双关语)似乎表明覆盖设备控制器的following blog post需要重新映射其所有指定的“HTTP动词”;这是有道理的,因为未映射的将由默认设计控制器处理。

如果有人有更多使用多种设计模型和分离管理方法的经验,我会对您的想法和建议非常感兴趣!