Подтвердить что ты не робот

В Rails, как иметь раздел /admin, а затем контроллеры в разделе администратора?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 3

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

namespace :admin do
  resources :users
end

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

rails g controller admin/users

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

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

Ответ 4

Затем в каждом контроллере администратора вам понадобится файл before_filter:

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

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

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

Ответ 5

Очевидно, что Тодд сказал правильно. Однако, если вы являетесь поклонником дополнительной безопасности через неясность, вы также можете хранить ваши помощники URL-адресов new_admin_user и 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/, но я не вижу никакого вреда в смелости быть другим с вашей консолью администратора пути действительно.

Ответ 6

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