#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’ довольно обычен.