Настройка файла Rails для панели управления?

#ruby-on-rails

#ruby-on-rails

Вопрос:

Как вы настраиваете свои представления, контроллеры и маршруты?

Один контроллер для всего, что делает панель управления, или много?

Во-первых, давайте попробуем подумать, как мы будем просматривать различные панели. Допустим, наша панель управления довольно проста. У нас есть одна панель, чтобы показать всех пользователей, которые зарегистрировались и могут их редактировать, и другая панель, чтобы показать все загруженные изображения, и мы также можем выполнять CRUD для них.

Маршруты:

 scope path: 'control_panel' do
      get 'users', to: 'panels#users', as: :panel_show_users
      get 'photos', to: 'panels#photos', as: :panel_show_photos
end
  

Контроллер:

 class PanelsController < ApplicationController
    def users
        @users = User.all
    end

    def photos
        @photos = Photo.all
    end
end
  

Просмотр файловой структуры:

 panels
  |_ users.html.erb
  |_ photos.html.erb
  

Хорошо, теперь я не вижу никаких проблем с этим, чтобы просто получить доступ к панелям и заполнить представления данными. Вы видите какие-либо проблемы?

Вот где я вроде как на перекрестке дорог. Что мне делать, если я хочу создать обновление и удалить пользователя / фотографию? Должен ли я поместить их все в PanelsController?

 class PanelsController < ApplicationController
    before_action :protect

    def users
        @users = User.all
    end

    def update_user
        @user = User.find(params[:id])
        @user.update(user_params)
    end

    def photos
        @photos = Photo.all
    end

    def update_photo
        @photo = Photo.find(params[:id])
        @photo.update(photo_params)
    end

    private

        def protect
            redirect_to root_url, error: 'You lack privileges!'
        end
end
  

Хотя это привело бы к большому PanelsController, было бы неплохо иметь возможность выполнить это действие защиты и только один перехват контроллера. Это также означало бы, что маршруты будут просты в настройке:

 scope path: 'control_panel' do
      get 'users', to: 'panels#users', as: :panel_show_users
      post 'user', to: 'panels#update', as: :panel_create_user

      get 'photos', to: 'panels#photos', as: :panel_show_photos
      post 'photos', to: 'panels#photos', as: :panel_create_photo
end
  

I should use resource routes here?

Like I say, this will result in a huge panels controller, so I was thinking it may be better to have a separate controller for each resource and then redirect to panels views?

Routes:

 scope path: 'control_panel' do
   resources :users
   resources :photos
end
  

Controllers:

 class UsersController < ApplicationController
     def index
     end

     def show
     end

     def new
     end

     def create
     end

     def update
     end

     def destroy
     end       
end

class PhotosController < ApplicationController
     def index
     end

     def show
     end

     def new
     end

     def create
     end

     def update
     end

     def destroy
     end       
end
  

Тем не менее, некоторые причуды все же есть. У меня там есть действие Users#index, но что, если у меня есть два маршрута, которые возвращают индекс всех пользователей? На панели управления, но также, например, когда люди ищут другого пользователя. Должен ли я иметь два маршрута в пользовательском контроллере? def public_users и def control_panel_users ? Это может быть ответом. Можно ли настроить перехват для запуска @users = User.all в обоих из них, но перенаправить в другое место и не protect перенаправлять их методом.

Как я должен защитить эти маршруты от не-администраторов? Должен ли я перенести свой метод защиты в контроллер приложения? Не будет ли это немного неудобно для настройки?

 class ApplicationController < ActionController
    before_action :protect

    def protect end
end

class StaticController < ApplicationController
    skip_before_action [:home, :about, :contact]

    def home
    end

    def about
    end

    def contact
    end
end
  

Но это мой вопрос. 1 контроллер панели управления или нет контроллера панели управления.

Я действительно хотел бы, чтобы там были более продвинутые учебные пособия: (Миллиарды книг по CRUD, MVC и прочим, но ничего о продвинутых вещах, таких как панели управления и AJAX…

Ответ №1:

У вас нет контроллера панели управления. И чтобы защитить материал от не-администраторов, используйте пространство имен — подробнее об этом здесь: http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing

Вы можете защитить свои контроллеры с пространством имен «admin» с помощью аутентификации, а контроллеры без пространства имен открыты для общего доступа (или открыты для пользователей, не являющихся администраторами)

Что касается вашего def public_users def control_panel_users вопроса и, у вас может быть просто два def index метода — один в контроллере без пространства имен и один в контроллере с пространством имен администратора. Каждый из них будет делать разные вещи.

Итак, всего у вас будет 4 контроллера:

2 без пространства имен, один для пользователей, один для фотографий (содержащий все общедоступные материалы)
2 с пространством имен администратора, один для пользователей, один для фотографий (содержащий все материалы панели управления)

Если вы хотите, вместо того, чтобы использовать «admin» в качестве пространства имен, вы могли бы использовать какой-нибудь другой термин, который вам больше нравится, например, «панель». Однако ‘Admin’ довольно обычен.