在Rails中,如何在管理部分中有/ admin部分,然后是控制器?

时间:2010-12-02 04:31:11

标签: ruby-on-rails

我希望在我的应用程序中有一个/ admin部分,并在此/ admin部分中包含路径,如:

www.example.com/admin/(只有某些用户可以访问此部分)

然后在本节中有控制器,如:

/admin/users/{add, new, etc}

对于这样的事情我有什么选择? (使用导轨3)

6 个答案:

答案 0 :(得分:40)

我更愿意做类似托德的回答,但略有不同。而不是将before_filter添加到与Admin内容相关的每个控制器,我更喜欢创建一个AdminController,所有与管理操作相关的控制器都可以继承自:

# config/routes.rb
namespace :admin do
  resources :users
end

# app/controllers/admin_controller.rb
class AdminController < ApplicationController
  before_filter :authorized?
  private
  def authorized?
    unless current_user.has_role? :admin
      flash[:error] = "You are not authorized to view that page."
      redirect_to root_path
    end
  end
end

# app/controllers/admin/users_controller.rb
class Admin::UsersController < AdminController
   ...
end

答案 1 :(得分:17)

在您的routes.rb中执行类似的操作:

  namespace :admin do
    resources :users
  end

有关详细信息,请参阅http://guides.rubyonrails.org/routing.html

然后在每个管理控制器中,你需要一个before_filter:

before_filter :authorized?
def authorized?
    #check if authorized here.
end

答案 2 :(得分:9)

正如Todd所说,你想要添加命名空间路线:

namespace :admin do
  resources :users
end

您还需要将控制器,视图等放在名为“admin /”的每个部分的子文件夹中。如果你是从头开始生成这个,那很简单:

rails g controller admin/users

这可能看起来相当复杂,但我有一篇文章介绍了所有这些,你可以下载一个示例rails 3应用程序来玩它:

Routing in Ruby on Rails 3

答案 3 :(得分:6)

  

然后在每个管理控制器中,你需要一个before_filter:

before_filter :authorized?
def authorized?
  #check if authorized here.
end

我认为如果将此代码放入从ApplicationController继承的主AdminController中会更好,那么每个管理控制器都将继承此AdminController。

关于Rails3,here是关于路线的好文章

答案 4 :(得分:3)

显然托德所说的是正确的。但是,如果您是通过默默无闻的额外安全性的粉丝,您还可以保留new_admin_user url帮助程序和Admin::命名空间控制器,但提供使用不太广泛的公共URL路径,其中包含以下内容:

scope  :module => "admin", :as => 'admin', :path => 'xyz' do
 resources :user
end

具有该设置的rake route将显示沿这些行的路线:

new_admin_user GET  /xyz/users/new(.:format)  {:controller=>"admin/users", :action=>"new"}

我认为唯一能阻挠的是一个不成熟的攻击者,他抓取并编译了一堆Rails网站,提供admin/的系统访问权限,但我认为与你的不同之处并没有什么害处管理控制台路径真的。

答案 5 :(得分:2)

application_controller.rb   
before_filter :if_namespace_is_admin?

def if_name_space_is_admin?
    #now you should check to see if the namespace is from admin
    #now you need namespaces because ruby ns confuse the f'out of me
end