В Rails, как иметь раздел / admin, а затем контроллеры в разделе admin? - PullRequest
17 голосов
/ 02 декабря 2010

Я хочу иметь раздел / admin в своем приложении и иметь маршруты в этом разделе / ​​admin, например:

www.example.com / admin / (только некоторые пользователи имеют доступ к этому разделу)

тогда есть контроллеры в этом разделе, такие как:

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

Какие у меня варианты для чего-то подобного?(с использованием рельсов 3)

Ответы [ 6 ]

41 голосов
/ 06 мая 2013

Я предпочитаю сделать что-то похожее на ответ Тодда, но немного другое.Вместо добавления before_filter к каждому контроллеру, связанному с администратором, я предпочитаю создавать 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
17 голосов
/ 02 декабря 2010

Сделайте что-то подобное в ваших маршрутах. 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
9 голосов
/ 02 декабря 2010

Как уже упоминал Тодд, вы хотите добавить маршрут в пространстве имен:

namespace :admin do
  resources :users
end

Вам также необходимо поместить свои контроллеры, представления и т. Д. В подпапки каждого из этих разделов, называемые «admin /». Если вы создаете это с нуля, это легко:

rails g controller admin/users

Это может показаться довольно сложным, но у меня есть статья, которая просматривает все это, с примером приложения rails 3, которое вы можете скачать, чтобы поиграть с ним:

Маршрутизация в Ruby on Rails 3

6 голосов
/ 02 декабря 2010

Тогда в каждом административном контроллере вам понадобится before_filter:

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

Я думаю, будет лучше, если он поместит этот код в главный AdminController, который наследуется от ApplicationController, затем каждыйКонтроллер администратора наследуется от этого AdminController.

О Rails3, здесь хорошая статья о маршрутах

3 голосов
/ 17 февраля 2011

Очевидно, что Тодд сказал правильно. Однако, если вы являетесь поклонником дополнительной безопасности через неизвестность, вы также можете оставить своих new_admin_user помощников по URL-адресам и Admin:: контроллеров пространства имен, но предоставьте менее широко используемый путь к общедоступным URL-адресам со следующим:

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

A rake route с этой настройкой покажет маршруты вдоль этих линий:

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

Полагаю, единственным действующим лицом, которому это помешает, является неискушенный злоумышленник, который просканировал и скомпилировал кучу сайтов Rails, предоставляющих доступ к системе на admin/, но я не вижу никакого вреда, если вы решитесь отличаться от вашей консоли администратора пути действительно.

2 голосов
/ 02 декабря 2010
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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...